redis数据类型详解+实例

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.mfbz.cn/a/74512.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超级品牌,都在打造数据飞轮

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 引入 「收钱吧到账15元。」 从北京大栅栏的糖葫芦铺子&#xff0c;到南京夫子庙的鸭血粉丝汤馆&#xff0c;再到广州珠江畔的早茶店&#xff0c;不知不觉间&#xf…

腾讯云国际站代充-阿里云ECS怎么一键迁移到腾讯云cvm?

今天主要来介绍一下如何通过阿里云国际ECS控制台一键迁移至腾讯云国际CVM。腾讯云国际站云服务器CVM提供全面广泛的服务内容。无-需-绑-定PayPal&#xff0c;代-充-值腾讯云国际站、阿里云国际站、AWS亚马逊云、GCP谷歌云&#xff0c;官方授权经销商&#xff01;靠谱&#xff0…

白帽黑帽与linux安全操作

目录 白帽黑帽 Linux安全 白帽黑帽 白帽&#xff08;White Hat&#xff09;和黑帽&#xff08;Black Hat&#xff09;通常用于描述计算机安全领域中的两种不同角色。白帽黑客通常被认为是合法的安全专家&#xff0c;他们通过合法途径寻找和修复安全漏洞&#xff0c;帮助企业和…

使用路由器更改设备IP_跨网段连接PLC

在一些设备IP已经固定,但是需要采集此设备的数据,需要用到跨网段采集 1、将路由器WAN&#xff08;外网拨号口&#xff09;设置为静态IP 2、设置DMZ主机&#xff0c;把DMZ主机地址设置成跨网段的PLC地址 DMZ主机 基本信息. DMZ (Demilitarized Zone)即俗称的非军事区&#xff0…

第5章:神经网络

神经元模型 上述定义的简单单元即为神经元模型。 多层网络 误差逆传播算法 标准BP算法&#xff1a;参数更新非常频繁&#xff0c;可能出现抵消现象。积累BP算法&#xff1a;下降到一定程度上&#xff0c;进行下一步会非常缓慢。 过拟合 早停&#xff1a;划分训练集和验证集…

小视频AI智能分析系统解决方案

2022下半年一个项目&#xff0c;我司研发一个基于接收小视频录像文件和图片进行算法分析抓拍的系统&#xff0c;整理了一下主要思想如下&#xff1a; 采用C开发一个AI识别服务&#xff0c;该服务具有如下功能: 创建各类算法模型服务引擎池&#xff0c;每类池内可加载多个模型…

TCP消息传输可靠性保证

TCP链接与断开 -- 三次握手&四次挥手 三次握手 TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中&#xff0c;这一…

计算机组成原理之地址映射

例1&#xff1a;某计算机主存容量256MB&#xff0c;按字编址&#xff0c;字长1B&#xff0c;块大小32B&#xff0c;Cache容量512KB。对如下的直接映射方式、4-路组相联映射方式、全相联映射方式的内存地址格式&#xff0c;求&#xff1a; &#xff08;1&#xff09;计算A、B、C…

05 - 研究 .git 目录

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git对象一共有三种&#xff1a;数据对象 blob、树对象 tree以及提交对象 commit&#xff0c;这些对象都被保…

详谈数据库InnoDB引擎与MyISAM引擎

目录 1. 简单了解什么是存储引擎? 2. InnoDB 引擎概述 3. MyISAM 引擎概述 4. InnoDB 与 MyISAM 的一些区别 1. 简单了解什么是存储引擎? 相信很多人在听到存储引擎这个名字的时候可能会有些疑惑&#xff0c;听着名字就觉得有些难&#xff0c;导致很多人没有兴趣了解它&a…

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具&#xff0c;是Java方法级别的mock&#xff0c;操作就是监听指定方法&#xff0c;返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术&#xff0c;将原始方法…

el-table实现静态和动态合并单元格 以及内容显示的问题

实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…

文本分类实战-NLP

数据集及任务分析 项目主题&#xff1a;新闻的主题分类&#xff0c;10分类任务 一般对于NLP项目来说的话需要进行数据预处理的&#xff0c;但是由于本项目的数据是经过处理过的&#xff0c;所以就不需要进行数据预处理了&#xff0c;但是数据预处理对NLP项目是重中之重的。 TH…

【Linux】高级IO

目录 IO的基本概念 钓鱼五人组 五种IO模型 高级IO重要概念 同步通信 VS 异步通信 阻塞 VS 非阻塞 其他高级IO 阻塞IO 非阻塞IO IO的基本概念 什么是IO&#xff1f; I/O&#xff08;input/output&#xff09;也就是输入和输出&#xff0c;在著名的冯诺依曼体系结构当中…

Python-OpenCV中的图像处理-视频分析

Python-OpenCV中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流 视频分析 学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift算法 Meanshift 算法的基本原理是和很简单的。假设我们有一堆点&#xff08;比如直方 图反向投影得到的点&…

低代码开发工具:JVS轻应用之间如何实现数据的调用?

在低代码开发平台中&#xff0c;如何实现应用之间的数据共享呢&#xff1f;最标准的方式是通过接口&#xff0c;本文介绍JVS轻应用如何实现将数据通过API输出、轻应用如何实现体内API数据的获取&#xff1f;实现方式如下图所示&#xff0c;不管是数据提供方&#xff0c;还是数据…

接口测试常用代理工具

些代理工具可以帮助我们构造各种测试场景、以及更好的完成测试工作。下面的介绍以 Charles 为主。 Charles Charles 是一款代理服务器&#xff0c;可以截取请求和响应达到分析抓包的目的&#xff0c;且支持多平台&#xff0c;能够在 Windows&#xff0c;Mac&#xff0c;Linux…

Spring Boot 集成 XXL-JOB 任务调度平台

一、下载xxl-job并使用。 二、将xxl-job集成到springboot里 一、 下载xxl-job并使用。 这一步没完成的请参考这个博客&#xff1a;http://t.csdn.cn/lsp4r 二、将xxl-job集成到springboot里 1、引入依赖 <dependency><groupId>org.springframework.boot</group…

Stable Diffusion +EbSynth应用实践和经验分享

Ebsynth应用 1.安装ffmpeg 2.安装pip install transparent-background,下载模型https://www.mediafire.com/file/gjvux7ys4to9b4v/latest.pth/file 放到C:\Users\自己的用户名.transparent-background\加一个ckpt_base.pth文件 3.秋叶安装ebsynth插件,重启webui 填写项目基本…

CSDN编程题-每日一练(2023-08-14)

CSDN编程题-每日一练&#xff08;2023-08-14&#xff09; 一、题目名称&#xff1a;小股炒股二、题目名称&#xff1a;王子闯闸门三、题目名称&#xff1a;圆小艺 一、题目名称&#xff1a;小股炒股 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&#xff1a; …
最新文章