redis中的数据类型: string,list, set, zset, hash,bitmaps, hyperloglog, gepspatial
目录
一、 String
二、List
三、Set
四、Zset
五、Hash
六、Bitmaps
七、Hyperloglog
八、Gepspatial
一、 String
redis最基本的数据类型,一个 key 对应一个 value。
一般用于缓存、限流、计数器、分布式锁、分布式Session等
String类型的值最大能存储512MB
相关命令:
1、set key value 设置指定key的值
set name zhangsan
设置一个key为name的value为zhangsan
2、get key 获取指定 key 的值
get name
获取到name的值为 "zhangsan"
3、getrange key start end 返回 key 中字符串值的子字符,end=-1时表示全部
getrange name 0 -1
获取到name中的所有值即 "zhangsan"
4、setbit key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
getbit key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)
偏移量offset必须大于或等于0,小于2^32
127.0.0.1:6379> get bits
(nil)
127.0.0.1:6379> setbit bits 100 1
(integer) 0
127.0.0.1:6379> getbit bits 100
(integer) 1
127.0.0.1:6379> getbit bits 50
(integer) 0
当键key不存在时,会自动生成一个位图。如果偏移量大于键key对应的位图长度,位图会先进行伸展,以确保它可以将value保存在指定的偏移量上。当位图进行伸展时,空白位置以0
填充
5、mset key value [key value ...] 同时设置一个或多个 key-value 对
mset num1 n1 num2 n2 num3 n3
同时设置多个key-value 对: num1:n1 num2:n2 num3:n3
msetnx key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
对不存在的key执行命令:
127.0.0.1:6379> msetnx key1 'a' key2 'b'
(integer) 1
127.0.0.1:6379> get key1
"a"
127.0.0.1:6379> get key2
"b"
对已存在的key执行命令:
127.0.0.1:6379> msetnx key2 'bb' key3 'c' #key2以及存在,因此操作失败
(integer) 0
127.0.0.1:6379> exists key3 #因为命令是原子性的,所以key3没有被设置
(integer) 0
127.0.0.1:6379> get key2 #key2没有被修改
"b"
6、mget key [key2...] 获取所有(一个或多个)给定 key 的值
127.0.0.1:6379> mget num1 num2 num3
1) "n1"
2) "n2"
3) "n3"
同时获取所有给定num1,num2,num3的值
7、getset key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
127.0.0.1:6379> getset name lisi
"zhangsan"
设置name的值为lisi,返回了name之前的旧值zhangsan
8、setex key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
127.0.0.1:6379> setex name 10 lisi
OK
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> get name
(nil)
将lisi关联到name,并将name的过期时间设为10s,过十秒后name的值lisi过期了,再次将访问获取不到 lisi
9、setnx key value 只有在 key 不存在时设置 key 的值
设置成功,返回1。设置失败,返回0
127.0.0.1:6379> setnx names wangwu
(integer) 1
127.0.0.1:6379> setnx name wangwu
(integer) 1
127.0.0.1:6379> setnx name lisi
(integer) 0
127.0.0.1:6379> get names
"wangwu"
127.0.0.1:6379> get name
"wangwu"
10、setrange key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
127.0.0.1:6379> get name
"wangwu"
127.0.0.1:6379> setrange name 4 liu
(integer) 7
127.0.0.1:6379> get name
"wangliu"
11、strlen key 返回 key 所储存的字符串值的长度
127.0.0.1:6379> get name
"wangliu"
127.0.0.1:6379> strlen name
(integer) 7
12、psetex key milliseconds value
与 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间
127.0.0.1:6379> psetex name 4000 wangliu
OK
127.0.0.1:6379> get name
"wangliu"
127.0.0.1:6379> get name
(nil)
13、incr key 将 key 中储存的数字值增一
127.0.0.1:6379> set numble 100
OK
127.0.0.1:6379> incr numble
(integer) 101
14、incrby key increment 将 key 所储存的值加上给定的增量值(increment)
127.0.0.1:6379> incrby numble 49
(integer) 150
15、increbyfloat key increment 将 key 所储存的值加上给定的浮点增量值(increment)
127.0.0.1:6379> incrbyfloat numble 1.0
"151"
16、decr key 将 key 中储存的数字值减一
127.0.0.1:6379> set numble 100
OK
127.0.0.1:6379> decr numble
(integer) 99
17、decrby key decrement key 所储存的值减去给定的减量值(decrement)
127.0.0.1:6379> decrby numble 49
(integer) 50
18、append key value
如果 key 已经存在并且是一个字符串,APPEND 命令将指定的 value 追加到该 key 原来值 value 的末尾
127.0.0.1:6379> get names
"wangwu"
127.0.0.1:6379> append names nihao
(integer) 11
127.0.0.1:6379> get names
"wangwunihao"
二、List
Redis列表是简单的字符串列表,按照插入顺序排序。
添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 2^32^ - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
List类型一般用于关注人、简单队列等。
相关命令:
1、lpush key value1 [value2] 将一个或多个值插入到列表头部
127.0.0.1:6379> lpush numble 1 2 3
(integer) 3
从左推入 值依次是3 2 1
2、lpop key 移出并获取列表的第一个元素
127.0.0.1:6379> lpop numble
"3"
3、lrange key start stop 获取列表指定范围内的元素
127.0.0.1:6379> lpush numble 3 2 1
(integer) 3
127.0.0.1:6379> lrange numble 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange numble 0 1
1) "1"
2) "2"
4、lpushx key value 将一个值插入到已存在的列表头部
127.0.0.1:6379> lpushx numble 0
(integer) 4
127.0.0.1:6379> lrange numble 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5、rpush key value1 [value2] 在列表中添加一个或多个值
127.0.0.1:6379> rpush numble 4 5 6
(integer) 7
127.0.0.1:6379> lrange numble 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
6、rpop key 移除列表的最后一个元素,返回值为移除的元素
127.0.0.1:6379> rpop numble
"6"
127.0.0.1:6379> lrange numble 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7、rpushx key value 为已存在的列表添加值
127.0.0.1:6379> rpushx numble 6
(integer) 7
127.0.0.1:6379> lrange numble 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8、llen key 获取列表长度
127.0.0.1:6379> llen numble
(integer) 7
9、linsert key before|after pivot value 在列表的元素前或者后插入元素
127.0.0.1:6379> linsert numble before 2 12
(integer) 8
127.0.0.1:6379> linsert numble after 3 34
(integer) 9
127.0.0.1:6379> lrange numble 0 -1
1) "0"
2) "1"
3) "12"
4) "2"
5) "3"
6) "34"
7) "4"
8) "5"
9) "6"
10、lindex key index 通过索引获取列表中的元素
127.0.0.1:6379> lindex numble 2
"12"
11、lset key index value 通过索引设置列表元素的值
127.0.0.1:6379> lset numble 0 01
OK
127.0.0.1:6379> lrange numble 0 -1
1) "01"
2) "1"
3) "12"
4) "2"
5) "3"
6) "34"
7) "4"
8) "5"
9) "6"
12、lrem key count value 移除列表元素
127.0.0.1:6379> lrem numble 0 01
(integer) 1
127.0.0.1:6379> lrange numble 0 -1
1) "1"
2) "12"
3) "2"
4) "3"
5) "34"
6) "4"
7) "5"
8) "6"
13、ltrim key start stop
对一个列表进行修剪,就是让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
127.0.0.1:6379> ltrim numble 1 7
OK
127.0.0.1:6379> lrange numble 0 -1
1) "12"
2) "2"
3) "3"
4) "34"
5) "4"
6) "5"
7) "6"
14、blpop key1 [key2] timeout
移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
127.0.0.1:6379> blpop name 5
(nil)
(5.02s)
127.0.0.1:6379> blpop numble 5
1) "numble"
2) "12"
127.0.0.1:6379> blpop numble 5
1) "numble"
2) "2"
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
在实例中,操作会被阻塞,列表name不存在数据,则在等待5秒后会返回 nil 。
列表numble存在数据则会返回第一个元素
15、brpop key1 [key2 ] timeout
移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
127.0.0.1:6379> brpop name 5
(nil)
(5.07s)
127.0.0.1:6379> brpop numble 5
1) "numble"
2) "6"
16、brpoplpush source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可lpu弹出元素为止
127.0.0.1:6379> lpush list1 'a'
(integer) 1
127.0.0.1:6379> lpush list2 'b'
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "a"
127.0.0.1:6379> lrange list2 0 -1
1) "b"
127.0.0.1:6379> brpoplpush list1 list2 5
"a"
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "b"
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
17、rpoplpush source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
127.0.0.1:6379> rpoplpush list2 list1
"b"
127.0.0.1:6379> lrange list1 0 -1
1) "b"
127.0.0.1:6379> lrange list2 0 -1
1) "a"
三、Set
redis 的 Set 是 String 类型的无序集合。
集合中成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32^ - 1 (4294967295, 每个集合可存储40多亿个成员)。
Set类型一般用于赞、踩、标签、好友关系等。
相关命令:
1、sadd key member1 [member2] 向集合添加一个或多个成员
127.0.0.1:6379> sadd member 1 2 3 4
(integer) 4
2、smembers key 返回集合中的所有成员
127.0.0.1:6379> smembers member
1) "1"
2) "2"
3) "3"
4) "4"
3、scard key 获取集合的成员数
127.0.0.1:6379> scard member
(integer) 4
4、srandmember key [count] 返回集合中一个或多个随机数
127.0.0.1:6379> srandmember member 2
1) "3"
2) "2"
127.0.0.1:6379> srandmember member 2
1) "1"
2) "2"
5、sismember key member 判断 member 元素是否是集合 key 的成员
127.0.0.1:6379> sismember member 2
(integer) 1
返回1代表2是集合member的成员
6、srem key member1 [member2] 移除集合中一个或多个成员
127.0.0.1:6379> srem member 3 4
(integer) 2
127.0.0.1:6379> smembers member
1) "1"
2) "2"
7、sdiff key1 [key2] 返回给定所有集合的差集
127.0.0.1:6379> smembers member1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> smembers member
1) "1"
2) "2"
127.0.0.1:6379> sdiff member1 member
1) "3"
2) "4"
8、sdiffstore destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
127.0.0.1:6379> sdiffstore member2 member1 member
(integer) 2
127.0.0.1:6379> smembers member2
1) "3"
2) "4"
9、sinter key1 [key2] 返回给定所有集合的交集
127.0.0.1:6379> sinter member member1
1) "1"
2) "2"
10、sinterstore destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
127.0.0.1:6379> sinterstore member3 member member1
(integer) 2
127.0.0.1:6379> smembers member3
1) "1"
2) "2"
11、sunion key1 [key2] 返回所有给定集合的并集
127.0.0.1:6379> sunion member member1 member2 member3
1) "1"
2) "2"
3) "3"
4) "4"
12、sunionstore destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
127.0.0.1:6379> sunionstore member4 member member1 member2 member3
(integer) 4
127.0.0.1:6379> smembers member4
1) "1"
2) "2"
3) "3"
4) "4"
13、smove source destination member 将 member 元素从 source 集合移动到 destination 集合
127.0.0.1:6379> smove member2 member 4
(integer) 1
127.0.0.1:6379> smembers member2
1) "3"
127.0.0.1:6379> smembers member
1) "1"
2) "2"
3) "4"
元素4 从 member2集合 移动到 member集合
14、spop key 移除并返回集合中的一个随机元素
127.0.0.1:6379> spop member
"2"
127.0.0.1:6379> smembers member
1) "1"
2) "4"
15、sscan key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素
-
==cursor==:游标
-
==MATCH pattern==:查询 Key 的条件
-
==Count count==:返回的条数,默认值为 10
SCAN 是一个基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。SCAN 以 ==0== 作为游标,开始一次新的迭代,直到命令返回游标 0 完成一次遍历。 此命令并不保证每次执行都返回某个给定数量的元素,甚至会返回 0 个元素,但只要游标不是 0,程序都不会认为 SCAN 命令结束,但是返回的元素数量大概率符合 Count 参数。另外,SCAN 支持模糊查询。
127.0.0.1:6379> sadd set1 'baidu' 'qq' 'weixi' 'kugou'
(integer) 4
127.0.0.1:6379> smembers set1
1) "weixi"
2) "baidu"
3) "kugou"
4) "qq"
127.0.0.1:6379> sscan set1 0 match i* count 2
1) "3"
2) (empty list or set)
四、Zset
Redis 有序集合和集合一样也是string类型元素的集合且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32^ - 1 (4294967295, 每个集合可存储40多亿个成员)。
Zset类型一般用于排行榜等。
1、zadd key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
127.0.0.1:6379> zadd set1 60 zhangsan 65 lisi 70 wangwu
(integer) 3
2、zcard key 获取有序集合的成员数
127.0.0.1:6379> zcard set1
(integer) 3
3、zcount key min max 计算在有序集合中指定区间分数的成员数
127.0.0.1:6379> zcount set1 60 66
(integer) 2
4、zincrby key increment member 有序集合中对指定成员的分数加上增量 increment
127.0.0.1:6379> zincrby set1 5 zhangsan
"65"
5、zlexcount key min max 在有序集合中计算指定字典区间内成员数量
127.0.0.1:6379> zlexcount set1 - +
(integer) 3
127.0.0.1:6379> zlexcount set1 [lisi [wangwu
(integer) 1
6、zrange key start stop [withscores] 通过索引区间返回有序集合指定区间内的成员
127.0.0.1:6379> zrange set1 1 2
1) "zhangsan"
2) "wangwu"
7、zrangebylex key min max [limit offset count] 通过字典区间返回有序集合的成员
127.0.0.1:6379> zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1
(integer) 12
127.0.0.1:6379> zrangebylex zset - + limit 0 3
1) "a"
2) "aa"
3) "abc"
127.0.0.1:6379> zrangebylex zset [aa [dd limit 1 4
1) "abc"
2) "apple"
3) "b"
4) "c"
8、zrangebyscore key min max [withscores] [limit] 通过分数返回有序集合指定区间内的成员
127.0.0.1:6379> zrangebyscore set1 60 66
1) "lisi"
2) "zhangsan"
9、zrank key member 返回有序集合中指定成员的索引
127.0.0.1:6379> zrank set1 wangwu
(integer) 2
10、zrem key member [member ...] 移除有序集合中的一个或多个成员
127.0.0.1:6379> zrem zset d d1 dd double
(integer) 3
11、zremrangebylex key min max 移除有序集合中给定的字典区间的所有成员
127.0.0.1:6379> zremrangebylex zset [a [c
(integer) 6
12、zremrangebyrank key start stop 移除有序集合中给定的字典区间的所有成员
127.0.0.1:6379> zrangebylex zset - +
1) "dobble"
2) "z"
3) "z1"
127.0.0.1:6379> zremrangebyrank zset 0 1
(integer) 2
127.0.0.1:6379> zrangebylex zset - +
1) "z1"
13、zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员
127.0.0.1:6379> zrangebylex set1 - +
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zremrangebyscore set1 60 70
(integer) 3
127.0.0.1:6379> zrangebylex set1 - +
(empty list or set)
14、zrevrange key start stop [withscores]
返回有序集中指定区间内的成员,通过索引,分数从高到低
127.0.0.1:6379> zadd zset 1 a 1 aa 2 abc 3 apple 4 b 8 c 10 d 110 d1 120 dd 60 dobble 50 z 40 z1
(integer) 12
127.0.0.1:6379> zrevrange zset 10 50
1) "aa"
2) "a"
15、zrevrangebyscore key max min [withscores]
返回有序集中指定分数区间内的成员,分数从高到低排序
127.0.0.1:6379> zrevrangebyscore zset 100 10 limit 0 3
1) "dobble"
2) "z"
3) "z1"
16、zrevrank key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
127.0.0.1:6379> zrevrank zset d
(integer) 5
17、zscore key member 返回有序集中,成员的分数值
127.0.0.1:6379> zscore zset d
"10"
18、zinterstore destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
取zkey1 和zkey2 2个有序集合的交集 保存至有序集合zkey3(zkey3若不存在则新建,若存在则覆盖)
127.0.0.1:6379> zadd zkey1 1 one 2 two 3 three 4 foure 5 five
(integer) 5
127.0.0.1:6379> zrange zkey1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "foure"
8) "4"
9) "five"
10) "5"
127.0.0.1:6379> zadd zkey2 10 one 20 two 60 six 70 seven
(integer) 4
127.0.0.1:6379> zrange zkey2 0 -1 withscores
1) "one"
2) "10"
3) "two"
4) "20"
5) "six"
6) "60"
7) "seven"
8) "70"
127.0.0.1:6379> zinterstore zkey3 2 zkey1 zkey2
(integer) 2
127.0.0.1:6379> zrange zkey3 0 -1 withscores
1) "one"
2) "11"
3) "two"
4) "22"
127.0.0.1:6379>
19、zunionstore destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
127.0.0.1:6379> zunionstore zkey4 1 zset
(integer) 12
127.0.0.1:6379> zrange zkey4 0 -1
1) "a"
2) "aa"
3) "abc"
4) "apple"
5) "b"
6) "c"
7) "d"
8) "z1"
9) "z"
10) "dobble"
11) "d1"
12) "dd"
20、 zscan key cursor [match pattern][count count]
迭代有序集合中的元素(包括元素成员和元素分值)
127.0.0.1:6379> ZADD wsite 8 "twle.cn" 7 "www.twle.cn" 2 "baidu.com" 3 "qq.com"
(integer) 4
127.0.0.1:6379> zscan wsite 0 match "t*"
1) "0"
2) 1) "twle.cn"
2) "8"
五、Hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32^ - 1 键值对(40多亿)。
Hash类型一般用于存储用户信息、用户主页访问量、组合查询等。
相关命令:
1、hset key field value 将哈希表 key 中的字段 field 的值设为 value
127.0.0.1:6379> hset hset1 name "zhangsan" age 18
(integer) 2
2、hget key field 获取存储在哈希表中指定字段的值
127.0.0.1:6379> hget hset1 name
"zhangsan"
3、hgetall key 获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hgetall hset1
1) "name"
2) "zhangsan"
3) "age"
4) "18"
4、hexists key field 查看哈希表 key 中,指定的字段是否存在
127.0.0.1:6379> hexists hset1 name
(integer) 1
127.0.0.1:6379> hexists hset1 address
(integer) 0
5、hsetnx key field value 只有在字段 field 不存在时,设置哈希表字段的值
127.0.0.1:6379> hsetnx hset1 name lisi
(integer) 0
127.0.0.1:6379> hsetnx hset1 address "hunan"
(integer) 1
127.0.0.1:6379> hgetall hset1
1) "name"
2) "zhangsan"
3) "age"
4) "18"
5) "address"
6) "hunan"
6、hkeys key 获取所有哈希表中的字段
127.0.0.1:6379> hkeys hset1
1) "name"
2) "age"
3) "address"
7、hvals key 获取哈希表中所有值
127.0.0.1:6379> hvals hset1
1) "zhangsan"
2) "18"
3) "hunan"
8、hlen key 获取哈希表中字段的数量
127.0.0.1:6379> hlen hset1
(integer) 3
9、hmget key field1 [field2] 获取所有给定字段的值
127.0.0.1:6379> hmget hset1 name age address
1) "zhangsan"
2) "18"
3) "hunan"
10、hmset key field value1 [field2 value2] 同时将多个 field-value (域-值)对设置到哈希表 key 中
127.0.0.1:6379> hmset hset1 name "lisi" age 19 address "hubei"
OK
127.0.0.1:6379> hmset hset1 gender "M" birth 2000-01-01
OK
127.0.0.1:6379> hgetall hset1
1) "name"
2) "lisi"
3) "age"
4) "19"
5) "address"
6) "hubei"
7) "gender"
8) "M"
9) "birth"
10) "2000-01-01"
11、hincrby key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment
127.0.0.1:6379> hincrby hset1 age 1
(integer) 20
12、hincrbyfloat key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment
127.0.0.1:6379> hincrbyfloat hset1 age 1
"21"
13、hdel key field1 [field2] 删除一个或多个哈希表字段
127.0.0.1:6379> hdel hset1 address
(integer) 1
127.0.0.1:6379> hgetall hset1
1) "name"
2) "lisi"
3) "age"
4) "21"
5) "gender"
6) "M"
7) "birth"
8) "2000-01-01"
127.0.0.1:6379> hdel hset1 address
(integer) 0
14、hscan key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对
127.0.0.1:6379> hscan hset1 0 match "*th*"
1) "0"
2) 1) "birth"
2) "2000-01-01"
六、Bitmaps
现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图:
合理地使用操作位能够有效地提高内存使用率和开发效率
1)Bitmaps本身不是一种数据类型,实际上它就是字符串(key-value),但是它可以对字符串的位进行操作。
2)Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
1、setbit
用于设置Bitmaps中某个偏移量的值(0或1),offset偏移量从0开始。
setbit <key> <offset> <value>
Redis SETBIT 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于 value,可以是 0 或者是 1 。
当 key 不存在时,自动生成一个新的字符串值。字符串会进行伸展以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。offset 参数必须大于或等于 0 ,小于 2^32 (bit 被限制在 512 MB 之内)。
127.0.0.1:6379> get sb1
(nil)
127.0.0.1:6379> setbit sb1 100 1
(integer) 0
127.0.0.1:6379> getbit sb1 100
(integer) 1
2、getbit
这个命令用于获取Bitmaps中某个偏移量的值。获取键的第offset位的值(从0开始算)
getbit <key> <offset>
127.0.0.1:6379> get sb1
(nil)
127.0.0.1:6379> setbit sb1 100 1
(integer) 0
127.0.0.1:6379> getbit sb1 100
(integer) 1
3、bitcount
这个命令用于统计字符串被设置为1的bit数。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。start 和 end 参数的设置,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,start、end 是指bit组的字节的下标数,二者皆包含。
bitcount <key> [start end]
用于统计字符串从start字节到end字节比特值为1的数量。
127.0.0.1:6379> set mykey "keyname"
OK
127.0.0.1:6379> bitcount mykey
(integer) 31
127.0.0.1:6379> bitcount mykey 0 0
(integer) 5
127.0.0.1:6379> bitcount mykey 0 1
(integer) 9
127.0.0.1:6379> bitcount mykey 1 1
(integer) 4
4、bitop
这个命令是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。
bitop and(or/not/xor) <destkey> [key…]
例如:2020-11-04 日访问网站的userid=1,2,5,9
127.0.0.1:6379> setbit unique:users:20201104 1 1
127.0.0.1:6379> setbit unique:users:20201104 2 1
127.0.0.1:6379> setbit unique:users:20201104 5 1
127.0.0.1:6379> setbit unique:users:20201104 9 1
2020-11-03 日访问网站的userid=0,1,4,9
127.0.0.1:6379> setbit unique:users:20201103 0 1
127.0.0.1:6379> setbit unique:users:20201103 1 1
127.0.0.1:6379> setbit unique:users:20201103 4 1
127.0.0.1:6379> setbit unique:users:20201103 9 1
计算出两天都访问过网站的用户数量
127.0.0.1:6379> bitop and unique:users:and:20201104_03 unique:users:20201103 unique:users:20201104
127.0.0.1:6379> bitcount unique:users:and:20201104_03
计算出任意一天都访问过网站的用户数量(例如月活跃就是类似这种), 可以使用or求并集
127.0.0.1:6379> bitop or unique:users:or:20201104_03 unique:users:20201103 unique:users:20201104
127.0.0.1:6379> bitcount unique:users:or:20201104_03
七、Hyperloglog
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8},那么这个数据集的基数集为 {1, 3, 5 ,7, 8},基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
1、pfadd key element [element...] 添加指定元素到 HyperLogLog 中
127.0.0.1:6379> pfadd course "redis" "mysql"
(integer) 1
2、pfcount key [ley ...] 返回给定 HyperLogLog 的基数估算值
127.0.0.1:6379> pfcount course
(integer) 2
3、pfmerge destkey sourcekey [sourcekey...] 将多个 HyperLogLog 合并为一个 HyperLogLog
127.0.0.1:6379> pfmerge new_course course courses
OK
127.0.0.1:6379> pfcount new_course
(integer) 4
将所有元素添加到指定HyperLogLog数据结构中。如果执行命令后HLL估计的近似基数发生变化,则返回1,否则返回0。
八、Gepspatial
GEO,Geographic,地理信息的缩写。
该类型,就是元素的2维坐标,在地图上就是经纬度。
redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
相关命令:
1、geoadd key longitude latitude member [longitude latitude member...]
添加地理位置(经度,纬度,名称)
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3
2、geopos key member [member...] 获得指定地区的坐标值
127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
3、geodist key member1 member2 [m|km|ft|mi] 获取两个位置之间的直线距离
127.0.0.1:6379> geopos china:city beijing shanghai km
1) 1) "116.38000041246414185"
2) "39.90000009167092543"
2) 1) "121.47000163793563843"
2) "31.22999903975783553"
3) (nil)
单位:
m:表示单位为米[默认值]。
km:表示单位为千米。
mi:表示单位为英里。
ft:表示单位为英尺。
4、georadius key longitude latitude radius [m|km|ft|mi]
以给定的经纬度为中心,找出某一半径内的元素
例子:获取经度为 110,纬度为 30,半径为 1000KM 的所有城市。
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。