本文主要讲解redis的6种数据类型。
string
redis的string可以存储3种数据类型:string,整数和浮点数。
常见的操作如下
描述 | ||
set | set key value | 设置键值对 |
get | get key | 获取值 |
incr | incr key | 递增值 |
decr | decr key | 递减值 |
strlen | strlen key | 获取字符串长度 |
incrby | incrby key increment | 增加指定数字 |
decrby | decrby key decrement | 减少指定数字 |
append | append key value | 向尾部添加值 |
getset | getset key value | 取值并赋值 |
setnx | setnx key value | 当value不存在时赋值 |
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS),采用预分配冗余空间减少内存的频繁分配,当value长度小于1m时,每次扩大1倍,当大于1m时每次多分配1m的空间,最大为512m。
使用场景:
①计数器
②共享session
③setnx实现分布式锁
list
list是列表结构,可以存储有序、可重复的元素,获取头部或尾部附近的记录是极快的
list的元素个数最多为2^32-1个(40亿)
命令名称 | 示例 | 描述 |
lpush | lpush key v1,v2… | 列表左边插入 |
lpop | lpop key | 列表左边弹出 |
rpush | rpush key v1,v2… | 列表右边插入 |
rpop | rpop key | 列表右边弹出 |
lpushx | lpushx key value | 将数值插入列表头部 |
rpushx | rpushx key value | 将值插入列表尾部 |
llen | llen key | 获取列表中元素个数 |
lindex | lindex key index | 获取列表中的下标 |
lrange | lrange key start end | 返回列表中指定区间的元素,区间通过start和end指定 |
lrem | lrem key count value | 删除列表中与value相等的元素 当count>0时, lrem会从列表左边开始删除;当count<0时, lrem会从列表后边开始删除;当count=0时, lrem删除所有值 为value的元素 |
lset | lset key index value | 将列表index位置的元素设置成value的值 |
ltrim | ltrim key start end | 对列表进行修剪,只保留start到end区间 |
rpoplpush | rpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧 |
brpoplpush | brpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧,会阻塞 |
list底层有多种数据类型,数据量少的时候是ziplist压缩列表,内存是连续分配的,当元素个数超过某个值时转为linkedlist双向链表,redis3.2之后数据量较多时改为quicklist。因为普通的链表需要附加指针空间,会浪费空间,加重内存碎片化。redis将链表和ziplist结合组成quicklist。
使用场景:
①用户列表,商品列表,评论列表等
②消息队列
③栈
set
无序不重复,集合中最大的成员数为 2^32 – 1
命令名称 | 示例 | 描述 |
sadd | sadd key v1 v2… | 为集合添加新成员 |
srem | srem key v1 v2 … | 删除集合指定成员 |
smembers | smembers key | 获取集合中所有元素 |
spop | spop key | 返回集合中一个随机元素,并将该元素删除 |
srandmember | srandmember key | 返回集合中一个随机元素,不会删除该元素 |
scard | scard key | 获取集合中的数量 |
sinter | sinter key1 key2 … | 求多集合的交集 |
sdiff | sdiff key1 key2… | 求多集合的差集 |
sunion | sunion key1 key2… | 求多集合的并集 |
set底层有两种数据结构,一种是inset数组,另一种是hashtable,如果保存的所有值都是整数且个数不超过512个则使用inset数组,否则使用hashtable
使用场景:
①统计网站uv
②统计共同好友
sortedset
有序集合,可以通过设置分数来对元素进行排序,元素不能重复,分数可以
命令名称 | 示例 | 描述 |
zadd | zadd key score1 v1 score2 v2… | 为集合添加新成员 |
zrem | srem key v1 v2 … | 删除集合指定成员 |
zcount | zcount key min max | 返回分数在[min,max]区间内的元素数量 |
zincrby | zincrby key increment member | 在集合的member分值上加increment |
zrank | zrank key member | 获取集合中member的排名(按分值从小到大) |
zrevrank | zrevrank key member | 和zrank相反 |
zrange | zrange key start end | 获取集合中指定区间成员,按分数递增排序 |
zrevrange | zrevrange key start end | 和zrange相反 |
zset底层是采用ziplist和skiplist结构,ziplist就是地址连续的压缩链表,按照分值从小到大排序,在满足一定条件下会转换成skiplist,即跳表。
使用场景:
①排行榜
hash
String 类型的 field(域)和 value(值)的映射表,每个hash可以存储2^32-1个键值对
命令名称 | 示例 | 描述 |
hset | hset key field value | 赋值 |
hmset | hmset key field1 value1 field2 value2… | 批量赋值 |
hsetnx | hsetnx key field value | 赋值,如果值存在则不操作 |
hget | hget key field | 获取一个字段值 |
hmget | hmset key field1 field2 | 获取多个字段值 |
hgetall | hgetall key | 获取所有值 |
hdel | hdel key field | 删除指定字段 |
hincrby | hincrby key field increment | 指定字段自增increment |
hlen | hlen key | 获取字段数量 |
底层使用hashtable存储数据
使用场景
①存储对象,应用在频繁写操作的场景,string主要用在频繁读操作场景
BitMap
BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。
命令名称 | 示例 | 描述 |
setbit | setbit key offset value | 设置key在offset处的bit值,只能是0或者1 |
getbit | getbit key.offset | 获取key在offset处的bit值 |
bitcount | bitcount key | 获取key的bit位为1的个数 |
bitpos | bitpos key value | 获取第一个值为value的bit的位置 |
bitop | bitop and[or/xor/not] destkey key [key …] | 对多个key 进行逻辑运算后存入destkey 中 |
使用场景:
①布隆过滤器
②统计用户每月签到,用户id为key,日期作为偏移量