【redis学习之二】Redis数据结构&&常用命令&&使用场景

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    
ZSet

      基于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    

猜你喜欢

转载自blog.csdn.net/smartValentines/article/details/80600783