redis 基本数据类型及场景
一:基本数据类型
String、List、Set、Hash、Zset
二:常见命令以及使用场景:
-
String: (help @string 用于查看string 相关的命令)
1.字符串中常用的命令 127.0.0.1:6379> set name www OK 127.0.0.1:6379> get name "www" 127.0.0.1:6379> append name .baidu.com (integer) 13 127.0.0.1:6379> get name "www.baidu.com" 127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> type name string 127.0.0.1:6379> strlen name (integer) 13 127.0.0.1:6379> set age 18 OK 127.0.0.1:6379> mget name age 1) "www.baidu.com" 2) "18" 127.0.0.1:6379> getrange name 4 -1 "baidu.com" 127.0.0.1:6379> Object encoding name "raw" 127.0.0.1:6379> del name (integer) 1 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> expire gq 10 (integer) 1 127.0.0.1:6379> ttl gq (integer) 7 127.0.0.1:6379> get gq "1101" 127.0.0.1:6379> get gq (nil) //解释:expire 设置过期时间 ttl 查看剩余的过期时间
2.字符串中的数值类型 127.0.0.1:6379> set count 22 OK 127.0.0.1:6379> get count "22" 127.0.0.1:6379> incr count (integer) 23 127.0.0.1:6379> incr count (integer) 24 127.0.0.1:6379> decr count (integer) 23 127.0.0.1:6379> decr count (integer) 22 127.0.0.1:6379> incrby count 10 (integer) 32
3.bit 二进制位的常用命令 127.0.0.1:6379> setbit s 1 1 (integer) 0 127.0.0.1:6379> setbit s 7 1 (integer) 0 127.0.0.1:6379> get s "A" //解释:设置s的二进制位第二位为 1 第七位为1 ,如果设置的长度过长 会自动扩容,此处为:01000001 对应ascll编码值为:65 对应"A" 127.0.0.1:6379> bitcount s 0 -1 (integer) 2 // 从0 到-1 中出现一的总计数量 127.0.0.1:6379> setbit s1 1 1 (integer) 0 127.0.0.1:6379> bitop or s2 s s1 (integer) 1 127.0.0.1:6379> bitcount s2 (integer) 1 // 解释:使用s 和s1 进行位运算 and 最终结果保存到s2中 s: 01000010 s1:01000000 s2 01000000
使用基本场景:
1 验证码过期时间,可以使用redis 保存设置过期
2 计数器与统计功能,可以使用redis的自增或者步增,进行统计计数
3 指定时间段活跃用户数量统计等类似场景,可以使用setbit 来进行统计
使用setbit 设置指定的位为 0 或 1 并通过 and or 等操作 进行运算,计算统计活跃数量(布隆过滤器)
-
List
127.0.0.1:6379> lpush list1 a b c d e (integer) 5 127.0.0.1:6379> lrange list1 0 -1 1) "e" 2) "d" 3) "c" 4) "b" 5) "a" 127.0.0.1:6379> rpush list1 A B (integer) 7 127.0.0.1:6379> lrange list1 0 -1 1) "e" 2) "d" 3) "c" 4) "b" 5) "a" 6) "A" 7) "B" 127.0.0.1:6379> lpop list1 "e" 127.0.0.1:6379> rpop list1 "B" 127.0.0.1:6379> lrange list1 0 -1 1) "d" 2) "c" 3) "b" 4) "a" 5) "A" 127.0.0.1:6379> llen list1 (integer) 5 127.0.0.1:6379> lindex list1 3 "a" 127.0.0.1:6379> linsert list1 before b yyyy (integer) 6 //brpoplpush 命令从列表中取出最后一个元素,并插入到另外一个列表的头部,BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT 127.0.0.1:6379> lrange list1 0 -1 1) "d" 2) "c" 3) "yyyy" 4) "b" 5) "a" 6) "A" 127.0.0.1:6379> ltrim list1 0 4 OK //保留下从0 到 4 位置的数据 127.0.0.1:6379> blpop list1 10 1) "list1" 2) "d" // 弹出并获取第一个元素,设置等待时间位10秒 127.0.0.1:6379> lrange list1 0 -1 1) "c" 2) "yyyy" 3) "b" 4) "a" 127.0.0.1:6379> lrem list1 1 yyyy (integer) 1 127.0.0.1:6379> lrange list1 0 -1 1) "c" 2) "b" 3) "a" //移除list1 中的yyyy 其中1 为正数 表示从左向右查看移除,0 移除所有,负数表示从右往左
使用场景:先入先出为队列,先入后出为栈,也可以当作数组来用。可以做分页,按照list的范围取值,可以提高分页的效率。
-
set
127.0.0.1:6379> sadd sets ooxx xxoo xoxo oxox xxoo oxxo xoxo (integer) 5 127.0.0.1:6379> scard sets (integer) 5 127.0.0.1:6379> sadd sets2 ooxx ooxx xoxo (integer) 2 127.0.0.1:6379> sdiff sets sets2 1) "oxox" 2) "oxxo" 3) "xxoo" 127.0.0.1:6379> sdiffstore sets3 sets sets2 (integer) 3 127.0.0.1:6379> sinter sets set2 (empty list or set) 127.0.0.1:6379> sinter sets sets2 1) "ooxx" 2) "xoxo" 127.0.0.1:6379> smembers sets 1) "xxoo" 2) "ooxx" 3) "xoxo" 4) "oxox" 5) "oxxo" 127.0.0.1:6379> sinter sets sets2 1) "ooxx" 2) "xoxo" 127.0.0.1:6379> smembers sets 1) "xxoo" 2) "ooxx" 3) "xoxo" 4) "oxox" 5) "oxxo" 127.0.0.1:6379> sismember sets oxox (integer) 1 127.0.0.1:6379> spop sets "ooxx" 127.0.0.1:6379> srandmember sets 4 1) "oxox" 2) "xoxo" 3) "oxxo" 4) "xxoo" 127.0.0.1:6379> sunion sets sets2 1) "oxxo" 2) "xxoo" 3) "ooxx" 4) "xoxo" 5) "oxox"
对应的命令解释如下: 1 SADD key member1 [member2] 向集合添加一个或多个成员 2 SCARD key 获取集合的成员数 3 SDIFF key1 [key2] 返回第一个集合与其他集合之间的差异。 4 SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中 5 SINTER key1 [key2] 返回给定所有集合的交集 6 SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中 7 SISMEMBER key member 判断 member 元素是否是集合 key 的成员 8 SMEMBERS key 返回集合中的所有成员 9 SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合 10 SPOP key 移除并返回集合中的一个随机元素 11 SRANDMEMBER key [count] 返回集合中一个或多个随机数 12 SREM key member1 [member2] 移除集合中一个或多个成员 13 SUNION key1 [key2] 返回所有给定集合的并集 14 SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中 15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素
主要使用:解决开发中实际存在的 集合运算,比如两个人的共同好友,两个人最近共同浏览的东西,等集合运算场景,但系统数据量过大,使用set可能会拖慢系统效率(没验证)
-
hash
127.0.0.1:6379> hmset map user xxx age 18 job worker OK 127.0.0.1:6379> hlen map (integer) 3 127.0.0.1:6379> hmget map user age 1) "xxx" 2) "18" 127.0.0.1:6379> hvals map 1) "xxx" 2) "18" 3) "worker" 127.0.0.1:6379> hexists map name (integer) 0 127.0.0.1:6379> hexists map user (integer) 1 127.0.0.1:6379> hgetall map 1) "user" 2) "xxx" 3) "age" 4) "18" 5) "job" 6) "worker" 127.0.0.1:6379> hkeys map 1) "user" 2) "age" 3) "job" 127.0.0.1:6379> hdel map user (integer) 1
1 HDEL key field1 [field2]
删除一个或多个哈希表字段
2 HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3 HGET key field
获取存储在哈希表中指定字段的值。
4 HGETALL key
获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key
获取所有哈希表中的字段
8 HLEN key
获取哈希表中字段的数量
9 HMGET key field1 [field2]
获取所有给定字段的值
10 HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value
将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key
获取哈希表中所有值。
14 HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
使用:与hashmap 功能类似,也可以用来存储对象属性。
-
zset
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数 2 ZCARD key 获取有序集合的成员数 3 ZCOUNT key min max 计算在有序集合中指定区间分数的成员数 4 ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment 5 ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中 6 ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量 7 ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员 8 ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员 9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员 10 ZRANK key member 返回有序集合中指定成员的索引 11 ZREM key member [member ...] 移除有序集合中的一个或多个成员 12 ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员 13 ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员 14 ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员 15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低 16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序 17 ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 18 ZSCORE key member 返回有序集中,成员的分数值 19 ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中 20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
使用场景:
1、根据时间排序的新闻列表等。
2、 排行榜
实现方式:edis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。