redis数据类型详解+实例

news2024/12/23 9:38:39

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 度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3:图片边框

简介 图片也可以作为边框&#xff0c;以下是实例演示 注意 实现该效果必须添加border样式&#xff0c;且必须位于border-image-socure之前否则不会生效 实例 <html lang"en"><head><style>p {width: 600px;margin: 200px auto;border: 30px soli…

为什么爬虫要用高匿代理IP?高匿代理IP有什么优点

只要搜代理IP&#xff0c;度娘就能给我们跳出很多品牌的推广&#xff0c;比如我们青果网路的。 正如你所看到的&#xff0c;我们厂商很多宣传用词都会用到高匿这2字。 这是为什么呢&#xff1f;高匿IP有那么重要吗&#xff1f; 这就需要我们从HTTP代理应用最多最广的&#xf…

企业数据库遭到360后缀勒索病毒攻击,360勒索病毒解密

在当今数字化时代&#xff0c;企业的数据安全变得尤为重要。随着数字化办公的推进&#xff0c;企业的生产运行效率得到了很大提升&#xff0c;然而针对网络安全威胁&#xff0c;企业也开始慢慢引起重视。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器遭到了…

从零开始学极狐GitLab|03 Runner 裸机部署

目录 极狐GitLab SaaS 版&#xff08;无需部署&#xff09; 安装自己的极狐GitLab- Runner 1. macOS ➤ 安装 ➤ 注册 2. Linux ➤ 安装 ➤ 注册 3. Windows ➤ 安装 ➤ 注册 【从零开始学极狐GitLab】专栏由极狐GitLab 社区开发者“雪碧能喝多”投稿&#xff0c;面…

Elasticsearch - 闲聊ElasticSearch中的分页

文章目录 概述分页方案from-size内部执行过程【Query】阶段【fetch】阶段潜在问题注意事项 深度分页Scroll &#xff08;Scroll遍历数据&#xff09;Scroll ScanSliced ScrollSearch After基于pit机制的search after 小结 概述 ElasticSearch是一款强大的搜索引擎&#xff0c;…

轻拍牛头(约数)

题意&#xff1a;求ai在n个数中&#xff0c;ai可以整除的数有多少个&#xff0c;不包括ai自己。 分析&#xff1a;暴力写需要n^2的时间复杂度&#xff0c;此时想一下预处理每个数的倍数&#xff0c;约数和倍数是有关系的&#xff0c;把每个数的倍数都加上1. #include<bits…

优思学院|在六西格玛项目中如何知道过程是否受控?

当我们说过程处于统计受控状态时&#xff0c;我们是指过程不存在特有原因。 以下面的图表来说明&#xff0c;过程处于“不受控”状态和“受控”状态时的情况。 当过程在统计意义上是受控的&#xff0c;它并不意味着过程产出的产品就不会超过规定的规范&#xff0c;符合质量要…

CondaValueError: Malformed version string ‘~‘: invalid character(s).

目录 问题描述&#xff1a; 问题解决&#xff1a; 问题描述&#xff1a; 在Conda环境中安装PyTorch、torchvision、torchaudio等软件包时&#xff0c;明明命令输入的没问题&#xff0c;却一直报错&#xff0c;说多了一个符号&#xff0c;报错界面如下&#xff1a; 问题解决&a…

美国过境签可否在美国境内续签?

美国过境签&#xff0c;也称为美国旅游签证或B类签证&#xff0c;通常用于短期访问美国的目的&#xff0c;比如旅游、商务会议、探亲等。过境签证持有者可以在签证规定的有效期内进入美国境内&#xff0c;并在允许的停留期内停留。然而&#xff0c;一般情况下&#xff0c;美国过…

海归事迹|记斯坦福大学博士后王成坤

王成坤&#xff0c;国内博士毕业后即赴美国斯坦福大学从事5年博士后研究&#xff0c;期间累计发表SCI论文23篇&#xff0c;总影响因子300&#xff0c;授权专利6项。现为南京医科大学高层次引进人才、教授、博士研究生导师、独立学术带头人。本期知识人网小编特做介绍。 百度百科…

日常BUG——git提交代码报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 git 在提交代码时报错&#xff1a; Committing is not possible because you have unmerge…

Java创建多线程的最全方法

Java创建多线程的最全方法 一、继承Thread&#xff0c;重写run方法二、实现Runnable接口&#xff0c;重写run方法三、使用匿名内部类创建 Thread 子类对象四、使用匿名内部类&#xff0c;实现Runnable接口五、实现Callable接口六、使用线程池创建线程 一、继承Thread&#xff0…

Jmeter性能测试 —— jmeter之使用ServerAgent监控服务器

ServerAgent 性能测试时我们关注的重要指标是&#xff1a;并发用户数&#xff0c;TPS&#xff0c;请求成功率&#xff0c;响应时间&#xff0c;服务器的CPU&#xff0c;memory&#xff0c; I/O disk等。Jmeter的聚合报告可以查看并发数、吞吐量、请求成功率、响应时间等&#…

看康师傅金桔柠檬X国漫IP跨界出圈,打开IP合作新思路

Z世代年轻群体已经成为消费主力&#xff0c;其喜好和消费观念也呈现出全新态势。抓住年轻人的心&#xff0c;就是抓住了品牌未来的战场。 那么到底什么样的营销动作才能真正撬动年轻人&#xff1f; 对于互联网时代成长起来的Z世代年轻人来说&#xff0c;人气二次元IP无疑是能最…

python实现樱花

python实现樱花 代码如下&#xff1a; from turtle import * from random import * from math import * def tree(n, l):pd () # 下笔# 阴影效果t cos ( radians ( heading () 45 ) ) / 8 0.25pencolor ( t, t, t )pensize ( n / 3 )forward ( l ) # 画树枝if n > 0:…

vue3+vite配置vantUI主题

❓在项目中统一配置UI主题色&#xff0c;各个组件配色统一修改 vantUI按需安装 参考vantUI文档 创建vantVar.less文件夹进行样式编写 vantVar.less :root:root{//导航--van-nav-bar-height: 44px;//按钮--van-button-primary-color: #ffffff;--van-button-primary-backgr…

Android免打包多渠道统计如何实现

摘要&#xff1a; 实际上只要完成1-2步即可实现多渠道打包&#xff0c;这也意味着&#xff0c;只要每次更新App时给出一个原始包&#xff0c;运营人员就能在后台自己进行操作管理&#xff0c;简单快捷到全程无需开发人员参与。 我们都知道&#xff0c;Android 市场被分割成几十…

如何分辨NMOS和PMOS的电路符号

这个是N沟道增强型MOS管的电路符号&#xff0c; 这个是P沟道增强型MOS管的电路符号&#xff0c;有时我们很容易把这两个符号弄混。 首先对于单个MOS管而言内部衬底和源极是接在一起的&#xff0c;所以我们看到的MOS管电路符号&#xff0c;源极和衬底是接在一起的&#xff0c;并…

VirtualBox虚拟机下载安装(win10)

1.官网下载安装包 https://www.virtualbox.org/ 1.1 跳转到下载页 1.2 下载安装包 * 如果打开安装包报错 搜索依赖的安装包 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist?viewmsvc-170 下载对应的安装包 安装完毕后再重新打开虚拟机安装包即…

高忆管理:熔断机制是哪年开始的?

随着经济全球化和金融商场的普及&#xff0c;股市投资逐步成为普通人的一种重要理财方法。但是&#xff0c;因为商场危险和不可控因素的存在&#xff0c;股市呈现极点状况下的商场崩盘和体系性危险成为了一种无法忽视的可能性。为了避免这种状况产生&#xff0c;一种受到广泛关…