## 常用的关于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
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数据类型的操作 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 中所有域的值。
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数据类型的操作 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 的元素。
1. 各种排行:比如电商系统上的每周/每月销量排行等定时计算出来的数据,建议存入list缓存中。实时计算的不建议 2. 各种列表:一些简单按照时间顺序排列的列表,比如点赞列表,关注列表等,利用LPUSH/RPUSH添加,LREM删除, 若列表数据过多,可以使用LRANGE 进行分页查询。 3. 消息队列:利用list的LPUSH/RPUSH来添加,LPOP/RPOP来消费。
## 常用的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 集合中
区别于list,我们需要知道set内存储的是无序不重复数据,list存储的是有序可重复数据。 1. 存储一些需要去重的列表数据。 2. 对各种集合进行差集,并集,交集的计算,比如QQ中每个用户都有自己的好友列表,通过对用户的好友的好友列表 求并集,计算出用户可能认识的人的推荐。 3. 通常,页面展示区域有限,但是又不能总是展示固定的内容,一种做法是先确定一批需要展示的内容,再从中随机获取。
## 常用的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是有序的不重复集合,比list,set要强大,但是同样的数据需要占据更大的内存,当在list和set无法实现 某一功能的时候,可以考虑使用sorted set。 1. 消息队列:当队列元素的消费规则不能简单得依据放入顺序执行时,可以考虑使用sorted set,比如在玩游戏的时候 进服务器需要排队,可以用用户消费金额作为分数标准来实现谁先进服务器。--可以这么做,但不是最优 2. 排行榜: 可以通过实时计算某个元素的分数来是实现实时排行榜。
欢迎指教!!!