Redis的数据类型及使用场景

一、string

  • string的常用操作
## 常用的关于string数据类型的操作
SET key value  ## 存入字符串键值对
MSET key value [key value ...] ## 批量存入字符串键值对
SETNX key value ## key不存在时存入并返回成功,存在返回存入失败
GET key ## 获取一个字符串键值
MGET key [key...] ## 批量获取字符串键值
DEL key [key...] ## 删除键值
EXPIRE key seconds ## 设置键值过期时间

## 原子加减操作
INCR key ## 将存储的数字加1
DECR key ## 将存储的数字减1
INCRBY key steps ## 将存储的数字加steps
DECRBY key steps ## 将存储的数字减steps
  • string的常用场景
    string数据类型是平时开发中用的最多的一种,其使用场景也是丰富多变
 1. 用于单值缓存:比如用户token;商品库存等。
有些单点登录(SSO)的解决方案中会将token存在redis中;在电商系统中超卖问题是很敏感的(特别在秒杀之类的活动中),
可以利用redis的单线程特性来解决库存超卖问题,还可以减少扣减库存时对数据库的频繁操作

 2. 用于对象存储:存储一些不会频繁操作的静态数据或者会被频繁查询的数据,比如商品的品类等信息,商品详情信息等。

 3. 用于分布式锁:在集群模式下,多个服务对同一个对象进行操作,可能会出现线程安全问题,但是jdk自带的锁只能作用于同一个jvm;
又或者在集群环境下,执行某一定时任务,到了某一时刻,所有web服务都会去执行这个定时任务,这时可以使用SETNX命令来实现分布式锁,
来保证数据安全,来保证同一个定时任务只执行一次。

 4. 计数器:INCR DECR等操作实现计数器,一般用于访问量统计,比如csdn的文章访问量,点赞数,收藏数等。

 5. 分布式全局id生成:redis同样可以利用自己的线程安全特性给分布式服务去生成全局唯一id。

 6. GetBit/SetBit/BitOp/BitCount可以用于统计日活,月活,签到情况等等, BitMap的玩法,比如统计今天的独立访问用户数时,
每个注册用户都有一个offset,他今天进来的话就把他那个位设为1,用BitCount命令就可以得出今天的总人数。

二、hash

  • hash的常用操作
## 常用的hash数据类型的操作
HDEL key field [field ...] ## 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
HEXISTS key field ## 查看哈希表 key 中,给定域 field 是否存在。
HGET key field ## 返回哈希表 key 中给定域 field 的值。
HGETALL key ## 返回哈希表 key 中,所有的域和值。
HINCRBY key field increment ## 为哈希表 key 中的域 field 的值加上增量 increment (可为负数)。
HINCRBYFLOAT key field increment ## 为哈希表 key 中的域 field 加上浮点数增量 increment(可为负数) 。
HKEYS key ## 返回哈希表 key 中的所有域。
HLEN key ## 返回哈希表 key 中域的数量。
HMGET key field [field ...] ## 返回哈希表 key 中,一个或多个给定域的值。
HMSET key field value [field value ...] ## 同时将多个 field-value (域-值)对设置到哈希表 key 中。
HSET key field value ## 将哈希表 key 中的域 field 的值设为 value 。
HSETNX key field value ## 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
HVALS key ## 返回哈希表 key 中所有域的值。
  • hash的常用场景
1.  在实际开发过程中,当需要将某个对象存入redis缓存时,很多人会直接将对象序列化作为string数据类型存入redis,
其实这也并不是不能,只是有些时候使用会没有那么方便,从而增加了代码复杂度。比如说在电商项目上利用redis
实现购物车,我们可能对每个用户都有一条购物车数据(其中包括商品信息,加购数量等重要信息),并且用户在前台
页面每次点击加减数量按钮时都需要对这条数据进行操作,此时如果直接存为json字符串格式,一次加减操作则需要
读取redis数据,反序列化数据,修改数量,存入redis等一系列操作,可能还需要考虑CAS的问题,但是如果直接存为
hash数据类型,则只需要直接通过HINCRBY操作完成加减,也没有CAS问题。
---从以上描述不难发现,如果缓存对象数据不仅仅是为了前台页面的展示,而是需要频繁操作的,那么就使用hash类型,因为hash类型的灵活性要强很多。

2.  hash数据类型同样可以用来实现索引,比如:redis中存有key=user:userId,value=用户对象的缓存数据,但是前台用户
需要使用用户名称去查找用户,这时候可以在redis中存一条hash(key=indexName field=userName value=id)。如果前台
需要按名称查用户,可以先查询索引的hash,找到用户id后,再去根据id查找用户详情。
----其实建索引用string类型也可以做,为什么只在hash中介绍呢?原因是便于管理,不想string那样比较散落,hash可以将所有索引存在一个hash中(在hash的最大范围内)

三、list

  • list的常用操作
## 常用的list数据类型的操作
LPUSH key value [value ...] ## 将一个或多个值 value 插入到列表 key 的表头
RPUSH key value [value ...] ## 将一个或多个值 value 插入到列表 key 的表尾(最右边)。

LRANGE key start stop ## 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
LINSERT key BEFORE|AFTER pivot value ## 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

LPOP key ## 移除并返回列表 key 的头元素。
RPOP key ## 移除并返回列表 key 的尾元素。

LREM key count value ## 根据参数 count 的值,移除列表中与参数 value 相等的元素。
	count 的值可以是以下几种:
	
	count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
	count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
	count = 0 : 移除表中所有与 value 相等的值。
	
LSET key index value ## 将列表 key 下标为 index 的元素的值设置为 value 。

LLEN key ## 返回列表 key 的长度。
LTRIM key start stop ## 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

LINDEX key index ## 返回列表 key 中,下标为 index 的元素。
  • list的常用场景
1.  各种排行:比如电商系统上的每周/每月销量排行等定时计算出来的数据,建议存入list缓存中。实时计算的不建议

2. 各种列表:一些简单按照时间顺序排列的列表,比如点赞列表,关注列表等,利用LPUSH/RPUSH添加,LREM删除,
若列表数据过多,可以使用LRANGE 进行分页查询。

3. 消息队列:利用list的LPUSH/RPUSH来添加,LPOP/RPOP来消费。

四、set

  • set的常用操作
## 常用的set数据类型的操作
SADD key member [member ...] ## 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
SCARD key ## 返回集合中元素的数量。
SDIFF key [key ...] ## 返回一个集合的全部成员,该集合是所有给定集合之间的差集。
SDIFFSTORE destination key [key ...] ## 等同与SDIFF 操作,额外将结果另存于destination 集合中
SINTER key [key ...] ## 返回一个集合的全部成员,该集合是所有给定集合的交集。
SINTERSTORE destination key [key ...] ## 等同于SINTER 操作,额外将结果存于destination 集合中
SISMEMBER key member ## 判断 member 元素是否集合 key 的成员。
SMEMBERS key ## 返回集合 key 中的所有成员。
SMOVE source destination member ## 将 member 元素从 source 集合移动到 destination 集合。
SPOP key ## 移除并返回集合中的一个随机元素。
SRANDMEMBER key [count] ## 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
	如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
	如果 	count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
SREM key member [member ...] ## 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
SUNION key [key ...] ## 返回一个集合的全部成员,该集合是所有给定集合的并集。
SUNIONSTORE destination key [key ...] ## 等同于SUNION 操作,额外将结果存于destination 集合中
  • set的常用操作
区别于list,我们需要知道set内存储的是无序不重复数据,list存储的是有序可重复数据。
1. 存储一些需要去重的列表数据。

2. 对各种集合进行差集,并集,交集的计算,比如QQ中每个用户都有自己的好友列表,通过对用户的好友的好友列表
求并集,计算出用户可能认识的人的推荐。

3. 通常,页面展示区域有限,但是又不能总是展示固定的内容,一种做法是先确定一批需要展示的内容,再从中随机获取。

五、sorted set

  • sorted set的常用操作
## 常用的sorted set数据类型的操作
ZADD key score member [[score member] [score member] ...] ## 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
ZRANGE key start stop [WITHSCORES] ## 返回有序集 key 中,指定区间内的成员。
ZREM key member1 [member2] ...  ## 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
ZSCORE key member ## 返回有序集 key 中,成员 member 的 score 值。
ZREVRANGE key start stop [WITHSCORES] ## 返回有序集 key 中,指定区间内的成员。
ZRANK key member ## 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
ZREVRANK key member ## 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
ZCARD key ## 返回有序集 key 的基数。
ZCOUNT key min max ## 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
ZINCRBY key increment member ## 为有序集 key 的成员 member 的 score 值加上增量 increment 。

  • sorted set的常用操作
sorted set是有序的不重复集合,比list,set要强大,但是同样的数据需要占据更大的内存,当在list和set无法实现
某一功能的时候,可以考虑使用sorted set。
1. 消息队列:当队列元素的消费规则不能简单得依据放入顺序执行时,可以考虑使用sorted set,比如在玩游戏的时候
进服务器需要排队,可以用用户消费金额作为分数标准来实现谁先进服务器。--可以这么做,但不是最优

2. 排行榜: 可以通过实时计算某个元素的分数来是实现实时排行榜。

欢迎指教!!!

上一篇:C++的STL容器之vector


下一篇:mysql索引的讲解和应用,必会