结构介绍
- redis 是一种高级的key-value的存储系统,其中value支持五种数据类型。
- 字符串(String)
- 哈希(Hash)
- 字符串列表(List)
- 字符串集合(Set)
- 有序字符串集合(Sorted Set)
- 关于key的注意事项
- key不可以太长,会消耗内存,降低查询效率
- key不可以太短,会降低key的可读性
- key最好有一个统一的命名规范
String 结构
概述
- 字符串类型是redis最基础的数据类型。
- 字符串类型在redis中是二进制安全的,这便意味着该类似的数据存入和获取的数据是相同的。
- 字符串类型的value可以容纳的数据长度最大为512M
命令
- 赋值:set key value
- 取值:get key
- 如果获取到的value不是String类型,redis会报错。
- 因为get命令只能用于获取String value。
- 如果redis中没有该key,则返回nil。
- 取值 + 赋值:getset key value
- 删除:del key
- 递增1:incr key
- 将key对应的value转成整型,然后原子性增1
- 如果key不存在,则初始化为0,增1后变成1
- 如果key对应的value转换不成整形,则redis会报错
- 递减1:decr key
- 和 incr key 相反
- 递增n:incrby key n
- 递减n:decr key n
- 拼接字符串:append key value
- 如果key存在,则拼接;如果不存在,则初始化为value
Hash 结构
概述
- 一个 hash,就相当于java的hashmap,里面存储很多的String key和String value
- 每个 hash 里面最多可以存储4294967295个键值对
命令
- 赋值:hset key field value,为指定的key设定field/value(键值对)
- 赋值:hmset key field value field2 value2 … 为指定的key一次性设定多个field/value(键值对)
- 取值:hget key field,返回key中field对应的value值
- 取值:hmget key field field2… 获取key中多个field对应的value值
- 取值:hgetall key,获取key中所有的field和value
- 删除:hdel key field field2 … 删除key中的一个或多个字段
- 删除:del key,删除整个key
- 递增n:hincrby key field n
- 递减n:hdecrby key field n
- 判断:hexists key field,判断key中是否存在field
- 查询:hlen key,查询key中包含的field的数量
- 查询:hkeys key,查询key中所有的field
- 查询:hvals key,查询key中所有的value
List 结构
概述
- list 类型就是按照插入顺序排序的字符串列表,类似java的LinkedList
- list 中最多可以包含4294967295个元素
- 性能:如果在列表的两头去插入或者删除元素,性能快;如果在列表的中间去插入或者删除元素,性能慢
- 插入时,如果key不存在,则自动创建一个key列表
- 删除时,如果所有的元素都被移除,则自动删除该列表
命令
- 头部添加:lpush key value value2 … 在列表key的头部添加一个或者多个value
- 尾部添加:rpush key value value2 … 在列表key的尾部添加一个或者多个value
- 查看列表:lrange key start end,获取列表key中从start到end之间的元素
start、end从0开始计数,如果为-1代表倒数第一个,-2代表倒数第二个 - 头部弹出:lpop key,返回并弹出列表key中的第一个元素
- 尾部弹出:rpop key,返回并弹出列表key中的最后一个元素
- 查询:llen key,查询列表key中所有元素的个数
- 添加:lpushx key value,如果key存在,则在其头部插入value,否则不插入
- 添加:rpushx key value,如果key存在,则在其尾部插入value,否则不插入
- 删除:lrem key n value,删除key中n个值为value的元素,如果n>0,则从头遍历,删除n个值为value的元素;如果n<0,则从尾遍历,删除n个值为value的元素;如果n=0,则删除所有值为value的元素
- 重置:lset key index value,设置列表key中脚标为index的元素的值
- 插入:linsert key before|after pivot value,在列表key的pivot元素前|后插入value元素
- 循环:rpop|rpush resource destination,从列表的尾部弹出并添加到头部
该命令较多用于消息队列中的信息交换
Set 结构
概述
- Set结构就是没有排序的字符串集合
- 一个Set最多可以插入4294967295个元素
- 与List结构的区别
- Set结构不允许出现重复元素
- 在服务器端完成多个Set集合的聚合(unions、intersections、differences)计算时,效率极高
命令
- 添加:sadd key value、value1 …
- 删除:srem key value、value1 …
- 查询所有元素:smembers key
- 判断元素是否存在:sismember key value 1:存在;0:元素不存在或者key不存在
- 差集运算:sdiff key1 key2
- 返回key1中与key2相差的元素,即返回key1中key2没有的元素,注意与key的顺序有关
- 交集运算:sinter key1 key2
- 返回key1和key2都有的元素
- 并集运算:sunion key1 key2
- 返回key1有或者key2有的元素
- 查询key中元素的数量:scard key
- 随机获取key中的一个元素:srandmember key
- 存储差集:sdiffstore dest src1 src2(将src1和src2的差集存储在dest中)
- 存储交集、存储并集类比
Sorted - Set 结构
概述
- Sorted-Set结构和Set 结构大致类似
- 区别如下:
- Sorted-Set结构中每个元素都有一个对应的score与之关联
- Sorted-Set结构通过score分数对元素进行从小到大的排序
- Sorted-Set结构中元素不可以重复,但是对应的score却可以相同
- Sorted-Set结构中增删改查都是非常快速的操作
命令
- 添加:zadd key score1 value1 score2 value2
- 查询:zscore key value,返回指定元素value的分数score
- 查询:zcard key,获取集合中元素的数量
- 查询:zrange key start end [withscores],获取脚标为start至end的元素,withscores表示同时返回分数score
- 查询:zrevrange key start end [withscores],和上面操作一致,不同的是按照分数从大到小进行排序
- 删除:zrem key value1 value2 … 删除指定的元素
- 删除:zremrangebyrank key start end,按照脚标范围删除元素
- 删除:zremrangebyscore key min max,按照分数范围删除元素
- zrangebyscore key min max [withscores] [limit offset count],返回分数在min至max范围内的元素并按照分数从小到大进行排序,withscores 同时返回分数,limit offset count 从脚标offset的元素开始返回count个元素
- zincrby key increment value,给指定成员增加increment分数,返回值是更改后的分数
- zcount key min max,获取分数在min至max之间的元素个数
- zrank key value,返回元素在集合中的位置(从小到大)
- zrevrank key value,返回元素在集合中的位置(从大到小)