乐趣区

关于java:java开发技术之Redis类型技能入门篇

字符串
首先 Redis 数据存储都会以 key value 的模式进行寄存,所有的 key 都是字符串类型。此处所说的类型特指的是 value 中寄存的类型。下文所讲的 hash、列表都是基于 value 上进行解说的。Redis 会依据传入字符串类型规定进行判断,java 培训并采取相应的外部编码进行存储。数值型会采纳 8 个字节的长整型进行编码存储,小于等于 39 个字节的字符串采纳 emstr 编码存储,大于 39 字节的字符串采纳 raw 编码存储。如果须要查看该键对应值的存储类型可运行 object encoding k1 命令。
• 罕用写命令

1// 1. 设置键:k1 值 v1
2set k1 v1
3// 2. 与上一个 set k1 v1 命令统一,且 k1 的生效工夫为 10s
4set k1 v1 ex 10 nx(k1 不存在能力设置胜利) 或 set k1 v1 ex 10 xx (k1 存在能力设置胜利)
5** k1 不存在能力设置胜利的 另一种写法
6setnx k1 v1
7** 设置 k1 生效工夫的另一种写法
8setex k1 10 v1
9// 3. 批量设置键值
10mset k1 v1 k2 v2 k3 v3
11// 4. 对 k1 中的数值进行自增操作,如果 k1 中的值类型不为数值类型将会返回谬误,如果不存在键 k1,会依照初始值 0 进行自增
12incr k1
13// 5. 对 k1 中的值按 2 的长度进行自增操作。
14incrby k1 2
• 罕用读命令

1// 1. 获取键 k1 的 值
2get k1
3// 2. 批量获取 k1,k2,k3 的值
4mget k1 k2 k3 k4 留神:key 个别咱们都会采纳业务名:对象名:属性名的形式进行命名。
哈希
哈希类型在 Redis 中 value 是以 {{key,value},{key,value}} 的模式存储,咱们通过字符和哈希类型的存储模型图来更直观的意识它们两者之间的关系,如图 1 -1

图 1 -1
Redis 对于哈希类型的存储会依据哈希类型个数(对应图中的 field 个数)采取不同编码进行存储。如果哈希类型个数小于 hash-max-ziplist-entries(默认 512 个)且所有值的(对应图中的 value)存储大小都小于 hash-max-ziplist-value(默认 64 字节)那么会应用更加紧凑的 ziplist 编码进行存储。
当无奈满足 ziplist 条件的时候会采纳 hashtable 编码方式进行存储。因为在节俭内存方面 ziplist 比 hashtable 更优良,但如果数据量上来后检索效率不迭 hashtable。
• 罕用写命令

1// 1. 给 regsiter:user:1 增加一对 field:value
2hset register:user:1 name zhangmj
3//2. 给 register:user:1 field(age)的 value 减少 2
4hincrby register:user:1 age 2
5//3. 批量给 regist:user:1 设置多个 field-value
6hmset register:user:1 name ‘zhangmoujiang’ age 12
7//4. 删除 register:user:1 的 name
8hdel register:user:1 name
• 罕用读命令

1// 1. 获取 register:user:1 的 name 的 value
2hget register:user:1 name
3// 2. 批量获取 register:user:1 多个 field 的 value
4hmget register:user:1 name age
5// 3. 获取 register:user:1 对应所有 field
6hkeys register:user:1
7// 4. 获取 register:user:1 对应所有 field 的 value
8hvals register:user:1
9// 5. 获取 register:user:1 所有 field 和 value
10hgetall register:user:1 列表
Redis 中列表类型的存储模型如图 1 -2:

图 1 -2
列表类型中 value 最多的存储元素为 2^32- 1 个, 可反复。value 元素的外部编码依据元素个数和大小会采取 ziplist 和 linkedlist 两种编码方式进行存储。当 value 元素个数小于 list-max-ziplist-entries(默认 512),同时 value 中每个元素的大小小于 list-max-ziplist-value(64 字节)会采取 ziplist 进行编码。
当无奈满足 ziplist 的条件会采取 linkedlist 编码。ziplist 编码对数据进行压缩以缩小内存,而 linkedlist 采纳链表的数据结构来存储数据。据说 Redis3.2 版本之后提供了一个更正当的外部编码 quicklist,它联合 ziplist 和 linkedlist 两者的劣势。
• 罕用写命令

为了行文不便 对于从左往右咱们用此图标进行标记:➡️, 从右往左用此图标标记⬅️,列表都特指 user:1:message
1//1. ⬅️给列表插入元素
2rpush user:1:message ‘piaoliang’ ‘ 帅气 ’
3//2. ⬅️给列表插入元素
4lpush user:1:message ‘xx1’ ‘xx2’
5//3. 在元素 xx2 之前插入 xx1.5
6linsert user:1:message before ‘xx2’ ‘xx1.5’
7//4. 在元素 xx2 之后插入 xx3
8linsert user:1:message after ‘xx2’ ‘xx3’
9//5. 从列表左侧弹出元素
10lpop user:1:message
11//6. 从列表右侧弹出元素
12rpop user:1:message
13//7. 从左侧弹出元素,如果列表不为空立刻弹出,如果列表为空将阻塞 3s 后返回。该命令的根本格局:blpop key [key] timeout,如果当 timeout 设为 0 且列表为空时,客户端运行此命令将会统一阻塞期待上来。如果设置了多个 key,只有有一个 key 列表中有元素会立刻返回
14blpop user:1:message 3
15//8. 同 brpop 只不过是 从右侧弹出元素
16brpop user:1:message 3
17
18
19// 9. 从左往右删除列表中等于 xx2 的 2 个元素
20// 该命令的根本格局为:lrem key count vlaue
21// 其中 count > 0 会从左往右删除 count 个等于 value 的元素
22// count < 0 则会从右往左删除 count 个等于 value 的元素
23// count =0 则会删除列表中所有等于 value 的元素
24lrem user:1:message 2 xx2
25// 10. 保留列表中第 2 个元素和第 4 个元素,其余全删除
26ltrim user:1:message 1 3
27// 11. 将列表中的第 1 个元素批改为 xxx0
28lset user:1:message 0 xxx0• 罕用读命令

1//1. ➡️ 获取 第 1 个和第 2 个元素。
2lrange user:1:message 0 1
3//2. ⬅️获取第 1 个和第 2 个元素
4// 假如列表元素为 g,f,h,k , 那么会获取 h,k 的元素
5lrange user:1:message -1 -2
6//3. 获取列表中从左边数,第 1 个元素
7lindex user:1:message -1
8//4. 获取 user:1:message 列表元素的长度
9llen user:1:message
10// 其中➡️列表元素索引下标 [0,N-1] , ⬅️列表元素索引下标:【-1,-N】N 为列表元素个数
• 利用场景

  1. 通过 lpush + brpop 命令 实现音讯队列。
  2. 每个用户都有属于本人的文章列表,须要分页显示各个用户的文章列表。

汇合
汇合类型的元素是能够反复的,如图 1 - 3 为汇合类型的存储模型图:

图 1 -3
汇合类型的外部编码有两种:

  1. intset, 当汇合类型为整数且数量小于 set-max-inset-entries(默认 512),会采取该编码方式
  2. 当无奈满足 intset 编码的条件会采取 hashtable

• 罕用的写命令

1// 1. 增加 tag1、tag2 元素
2sadd user:1 tag1 tag2
3// 2. 删除 tag2 元素,返回删除胜利的个数
4srem user:1 tag2
5// 3. 从汇合中随机弹出一个元素 / 从汇合 随机弹出 n 个元素
6spop user:1
7// 4. 将汇合【user:1】和【user:2】交加后果寄存到 destination
8sinterstore destination user:1 user:2
9// 5. 汇合【user:1】和 汇合【user:2】并集后果寄存到 destination
10sunionstore destination user:1 user:2
11// 6. 汇合【user:1】和 汇合【user:2】差集后果寄存到 destination
12sdiffstore destination user:1 user:2
• 罕用的读命令

1// 1. 计算元素个数
2scard user:1
3// 2. 汇合中是否存在 tag3 元素
4sismember user:1 tag3
5// 3. 从汇合随机返回一个元素 / 从汇合随机返回 2 个元素
6srandmember user:1 / srandmember user:1 2
7// 4. 获取汇合中的所有元素,返回的后果是无序的
8smembers user:1
9
10// 5. 求 汇合【user:1】和 汇合【user:2】的交加
11sinter user:1 user:2
12// 6. 求 汇合【user:1】和 汇合【user:2】的并集
13sunion user:1 user:2
14// 7. 求汇合间的差集,即:user:2 汇合的元素不在 user:1 中
15sdiff user:2 user:1
留神:当汇合的元素过多的时候,应用 smembers 命令会有损性能,倡议应用 sscan 命令来实现。
有序汇合
有序汇合类型的存储模型如图 1 -4:

图 1 -4
它能够类比汇合类型和哈希类型的组合,其中 value 中蕴含两个次要的字段 score 和 member,member 中元素的值不可能反复,而 score 中元素的类型为整型值可能反复。通过 score 中元素的值咱们可能对 member 中的元素进行排序。
外部也采纳了两种编码:

  1. ziplist(压缩列表)
  2. skiplist(跳跃表)

• 写操作命令

1// 1. 增加汇合成员,(85、zmj)
2zadd users 85 zmj
3// 2. 增加汇合成员,存在能力设置胜利
4zadd users XX 87 zhangmoujiang
5// 3. 增加汇合成员,不存在能力设置胜利
6zadd users NX 87 zhangmoujiang
7// 4. 删除汇合内成员 caonimei
8zrem users caonimei
9// 5. 给成员 xunini 减少 1 分,如果没有成员会主动增加
10zincrby users 1 xuxnini • 读操作命令

1// 1. 获取汇合内成员数量
2zcard users
3// 2. 获取汇合内 zmj 成员的分数
4zscore users zmj
5// 3. 获取汇合内 chenxiongshun 成员分数的排名(分数从低到高)
6zrank users chenxiongshun
7// 4. 同 zrank 一样(分数从高到低)
8zrevrank users chenxiongshun
9// 5. 返回指定排名的范畴的成员(分数从低到高)
10zrange users 0 2 [withscores]
11// 6. 同 zrange 一样(分数从高到低)
12zrevrange users 0 1 [withscores]
13// 7. 依照指定分数从低到高返回成员
14// 根本格局 zrangebyscore key min max [withscores] [limit offset count]
15zrangebyscore users 50 90
16// 8. 返回指定分数的范畴内的成员个数
17zcount users 0 100
几个治理键的常用命令
1//1. 以后数据库的键数量
2dbsize
3//2. 随机返回以后数据的一个键
4randomkey
5//3. 设置键 key1 20 秒过期,如果键不存在返回后果为 0。某个键设置了过期工夫,而后执行了 set 命令,那么该键的过期工夫会被革除。
6expire key1 20
7//4. 查看 key1 键还剩几秒过来,返回数字的单位为秒。返回 -2 示意已过期
8ttl key1
9//5. 移除键 key1 的过期工夫
10persisit key1
11//6. 获取所有键,keys 前面可接类正则的表达式来匹配键的名称
12keys *
13//7. 抉择 0 号数据库,redis 中默认有 16 个数据库,编号从 0 开始 …
14select 0
15//8. 革除以后数据库数据
16flushdb
17//9. 革除所有数据库数据
18flushall

退出移动版