愉快的周末又要来临了,对于极度热爱工作的我来说。。美滋滋。为了让大家有一个愉快的周末,今天来说点基础的东西,当做睡前催眠小文章。
redis 数据类型
redis 包含5种数据类型,相对于其他繁多的数据类型,只有5个可以说是非常有良心了。分别是 string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。
下面我们来分别介绍及其使用场景。
string 字符串
- 最常见的数据类型,一个 key 对应一个 value,理论上来讲 value 可以存储任何数据。一个键最大能存储 512M。
- 操作
set key value 设置键值
get key 获取指定key value
incr key 指定 key value 自增1,value 值需为整数
incrby key num 指定 key value 自增 num
decr/decrby 递减
incrbyfloat key num 增加指定浮点数
append key value 指定键值尾部追加值
strlen key 获取指定键值长度
mset key1 value1 key2 value2 同时设置多个键值
mget key1 key2 同时获取多个键值
- 使用场景:复杂的计数功能的缓存、避免重复提交锁。
Hash 散列
- 键值对合集,string 类型的 field 和 value 的映射表。每个 hash 可以存储 232 - 1 键值对(40多亿)。
注:redis 所有数据类型的值都不支持数据类型嵌套。散列的 value 值只能是字符串,集合的元素只能为字符串,不能为集合或者散列表。
- 操作
hset key field value 设置 key 下 field 字段的 value 值
hget key field 获取 key 下 field 字段的 value 值
hmset key field1 value1 field2 value2 批量设置
hmget key field1 field2 批量获取
hgetall key 获取该 key 下的所有字段值
hexists key field 判断字段是否存在
hsetnx key field value 字段不存在赋值
hincrby key field num 设置字段 field 自增 num,字段不存在会默认创建且值为0
hdel key field [field2...] 删除一个或多个字段
hkeys key 只获取字段名
hvals key 只获取字段值
hlen key 获取字段数量
- 使用场景:存储用户信息(姓名、年龄、性别等),方便读取。
- 补充
对比 mysql 表结构,更加灵活。比如存储用户信息,必要信息为 姓名、年龄、性别,非必要信息为 职能、爱好。
即使个别用户不存在非必要信息,mysql 表结构也需要设置这两个字段,而 hash 则可以省去这两个字段。
List 列表
- 字符串列表,按照插入顺序排序。也就是说列表数据是有序的。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。双向链表实现。
- 操作
lpush/rpush key value [value2...] 向列表左/右边增加元素,返回增加元素后的列表长度。
lpop/rpop key 从列表左/右边弹出元素,返回被弹出元素。
注:结合以上命令,可以分别将列表当成栈或者队列来操作。
llen key 返回列表中元素个数。
lrange key start end 获取列表片段,start、end 为列表索引起始值。
ltrim key start end 只保留索引片段
lrem key count value 删除前 count 个值为 value 的元素,返回删除个数。count 为0时,删除所有值为 value 的元素。
lindex key index 获得指定索引元素值。若 index 为负数,则从右边开始计算索引,右边第一个索引值为 -1.
lset key index value 设置指定索引元素值
linsert key before | after pivot value 向指定元素 pivot 前后插入指定元素 value。返回插入后的列表元素个数。
- 使用场景:
1、利用其有序特性,可以做简单的消息队列功能。
2、获取中间元素慢,两边元素快。实现 新鲜事、日志类似功能。
Set 集合
- string 类型的无序集合。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
集合类似列表,但是有本质区别。
- 操作
sadd key member [member2...] 向集合中增加元素。已存在的自动忽略,返回增加成功元素个数(不统计忽略元素)。
srem key member [member2...] 删除元素
smembers key 获取集合中所有元素
sismember key member 判断元素是否在数组中
sdiff keyA keyB 差集,支持多个数组,按顺序取差集。
sinter keyA keyB 交集
sunion keyA keyB 并集
scard key 获取集合元素个数
sdiffstore destination key [key2...] 数组运算并将结果存储
srandmember key [count] 随机获取数组中元素
spop key 随机弹出元素
- 使用场景:交集,并集,差集
zset 有序集合
- zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个分数用来做排序。既然是集合,自然集合的所有特性它都有,比如插入、删除和判断元素是否存在集合中;当然,关联了分数且是有序的,自然也会有自己的特性,比如通过分数获取前N个元素、获得指定范围的元素等。
- 和列表相比,有什么相同或者不同呢?
相同点
1、有序
2、都可以获得范围内元素
不同点
1、列表通过链表实现,获取数据时,两端快中间慢。
2、有序集合通过散列表和跳跃表实现,即使读取中间部分数据也很快。
3、有序集合比列表更耗费内存。
- 操作
zadd key score menber [score1 member1...] 添加元素到集合,元素在集合中存在则更新对应score。
zscore key member 获取元素分数
zrange key start stop [withscores] 获取排名从小到大在某个范围的元素列表(先按照分数优先排序,排序后会分配索引)
zrevrange key start stop [withscores] 从大到小
zrangebyscore key min max [withscore] [limit offset count] 获取指定分数范围的元素
zrevrangebyscore key max min 从大到小取值,如小于100分的元素
zincrby key increment member 增加元素分数
zcard key 获取集合中元素数量
zcount key min max 指定分数范围内元素个数
zrem key member [member1...] 删除元素
zremrangebyrank key start stop 按照排名删除元素
zremrangebyscore key min max 按照分数范围删除元素
zrank key member 获得元素排名,从小到大顺序
zrevrank key member 从大到小顺序
- 使用场景:排行榜 、带权重的消息队列
参考文章: