String
在redis内部实现为SDS(simple dynamic string),为键值对类型,通过set key value 可以实现memcached的键值对缓存功能。亦可将对象序列化或转化为json后通过key-value形式存储。但是注意由于redis的单线程模型,若是value太大,单个string的读取将会缓慢,影响redis服务器效率,value的网络传输及在程序中反序列化也是一笔不小的开销
使用场景:
①key-value型缓存;②利用incr key实现原子计数器功能;③全局限流,亦是利用计数功能;④利用setnx实现分布式锁
基本操作命令:
set key value | 设置指定key值 | get key | 获得指定key的value |
getrange key start end | 返回 key 中字符串值的子字符 | getset key value | 设置制定key值,并返回value旧值 |
mget key1 key2 ... | 一次获取多个key的value | setex key seconds value | 将value关联到key,并设置若干seconds后过期 |
setnx key value | set if not exists,key不存在时则设置 | strlen key | 返回value的字符串长度 |
mset key value key value | 一次设置多个key-value对 | msetnx key value key value | 一次设置多个key-value(若key-value不存在) |
psetnx key miliseconds value | 将value关联到key,并设置若干毫秒后过期 | incr key | 对数字型value+1 |
incrby key increment | 对数字型value+increment | decr key | 对数字型value-1 |
decrby key decrement | 对数字型value-decrement | append key value | 对string型value后边拼接value |
Hash
可理解为java中的hashMap,特别适合存储对象。底层实现可以为zipList、Dict,包含key-value对较少时为ziplist实现,ziplist是一种压缩链表,采用一块连续内存存储,减少了内存碎片,在数据量不是很大的时候,遍历zipList去找目标键值对。可在redis-conf中设置当hash多大时需转换成Dict结构
使用场景:
①分布式系统中存储共享session ②保存对象类缓存,例如用户信息
基本操作命令:
hdel key field | 删除hash中某个key-value对 | hexists key field | 查看hash中某key是否存在 |
hget key field | 获取hash中某key的value | hgetall key | 获取hash中所有的key-value |
hincrby key field increment | 对hash中某key的value+increment | hkeys key | 获取hash表中所有的key |
hlen key | 获取hash中的key的数量 | hmget key field field | 获取多个key的值 |
hmset key filed value field value | 添加多个键值对 | hset key field value | 添加键值对 |
hsetnx keyfield value | 若不存在则添加相应键值对 | hvals key | 获取所有value |
List
即为链表,可以对链表两端进行插入、弹出操作,也可以根据索引下标获取某个区间的元素。它是有序的,也允许有重复的元素
使用场景:
①利用lpush+brpop实现生产者消费者阻塞队列,生产者通过lpush从链表左侧插入元素,消费者通过brpop从链表右端获取元素,若是链表为空则堵塞
②lpush+lpop =stack栈 ;lpush+rpop =queue队列
基本操作命令:
blpop key timeout | 移除并获取左端第一个元素,若无元素则阻塞直至超时 | brpop key timeout | 移除并获取右端第一个元素,若无元素则阻塞直至超时 |
lindex key index | 获取链表中下标为index的元素 | linsert key before|after pivot valut | 在某元素前/后插入元素 |
llen key | 获取链表元素个数 | lpop key value | 弹出左端第一个元素 |
lpush key value | 往左端插入一个元素 | lpushx key value | 覆盖左端第一个元素 |
lrange key start stop | 获取从start到stop下标的元素 | lrem key value | 移除某元素 |
lset key index value | 通过下标设置某元素值 | rpop key | 弹出右端第一个元素 |
rpoplpush key destination | 将右端第一个元素移除并添加至destinationlian链表 |
Set
与list不同的是它是无序的,且不允许有重复元素,不可以通过下标获取元素,但支持取交集、并集、差集
应用场景:
①社交场景中求共同好友,共同爱好、可能认识的好友(差集)等
②需要标签的场景,通过标签做推荐
sadd key member1 member2 | 向集合中添加元素 | scard key | 获取集合中元素个数 |
sdiff key1 key2 | 求集合差集 | sdiffstore des key1 key2 | 获取集合差集放在des集合中 |
sinter key1 key2 | 求集合交集 | sinterstore des key1 key2 | 获取集合交集放入des集合中 |
sismember key member | 查看集合中是否存在该元素 | smembers key | 列出所有元素 |
spop key | 随机移除并返回一个元素 | srandmember key count | 返回一个或多个随机元素 |
srem key member1 member2 | 移除一个或多个元素 | sunion key1 key2 | 返回并集 |
sunionstore des key1 key2 | 将并集放入des |
基于dict与skipList实现的有序集合,与set一样不允许有重复元素,但是它是有序的,给每个元素设置了一个score,按score排序,score可以重复。skiplist实现可以快速根据score定位到元素甚至是根据score范围查询,而skiplist本质为多层有序链表,查找时间复杂度为logN,最下层链维护了反向链接,支持倒序。
使用场景:
①排行榜、访问量排名、播放量排名等需要排序的场景
常用命令:
zadd key score member1 score member2 | 添加一个或多个元素并设置分值 | zcard key | 查询元素总数 |
zcount key min max | 查询在某分数区间的元素个数 | zincrby key member increment | 为某元素分数+increment |
zinterstore des key1 key2 | 计算交集并赋给des | zlexcount key min max | 在有序集合中计算指定dict间成员数量 |
zrange key start stop | 返回指定索引区间元素 | zrangebylex key min max | 返回指定元素区间的成员元素 |
zrangebyscore key start stop | 返回指定分数区间的元素 | zrank key member | 返回元素排名 |
zrem key member1 member2 | 移除元素 | zremrangebylex key min max | 移除指定dict区间元素 |
zremrangebyrank key start stop | 移除指定排名区间的元素 | zremrangebyscore key start stop | 移除指定分数区间的元素 |
zrevrangeby score key start stop | 返回指定分数区间元素 | zscore key member | 返回元素分数 |
zunionstore des key1 key2 | 将并集放入des |