Redis五大数据类型

Redis五大数据类型

在这里插入图片描述

Redis-Key

官网:https://www.redis.net.cn/order/

序号命令语法描述
1DEL key该命令用于在 key 存在时删除 key
2DUMP key序列化给定 key ,并返回被序列化的值
3EXISTS key检查给定 key 是否存在,存在返回1,否则返回0
4EXPIRE key seconds为给定 key 设置过期时间,以秒计
5EXPIREAT key timestampEXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳
6PEXPIRE key milliseconds设置 key 的过期时间以毫秒计
7PEXPIREAT key milliseconds-timestamp设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
8KEYS pattern查找所有符合给定模式( pattern)的 key
9MOVE key db将当前数据库的 key 移动到给定的数据库 db 当中
10PERSIST key移除 key 的过期时间,key 将持久保持
11PTTL key以毫秒为单位返回 key 的剩余的过期时间
12TTL key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
13RANDOMKEY从当前数据库中随机返回一个 key
14RENAME key newkey修改 key 的名称
15RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey
16SCAN cursor [MATCH pattern] [COUNT count]迭代数据库中的数据库键
17TYPE key返回 key 所储存的值的类型
18SELECT db选择数据库 数据库为0-15(默认一共16个数据库)
19DBSIZE查看数据库的key数量
20FLUSHDB清空当前数据库
21FLUSHALL清空所有数据库
22ECHO打印命令
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name zs
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> clear
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 5
127.0.0.1:6379> 

String(字符串)

Redis 字符串数据类型的相关命令用于管理 redis 字符串值

String 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

String 类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

String 类型是 Redis 最基本的数据类型,String 类型的值最大能存储 512MB。

String类型一般用于缓存、限流、计数器、分布式锁、分布式Session

Redis 字符串命令

下表列出了常用的 redis 字符串命令:

序号命令语法描述
1SET key value设置指定 key 的值
2GET key获取指定 key 的值
3GETRANGE key start end返回 key 中字符串值的子字符,end=-1时表示全部
4SETBIT key offset value对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
5GETBIT key offset对 key 所储存的字符串值,获取指定偏移量上的位(bit)
6MSET key value [key value …]同时设置一个或多个 key-value 对
7MGET key1 [key2…]获取所有(一个或多个)给定 key 的值
8GETSET key value将给定 key 的值设为 value ,并返回 key 的旧值(old value)
9SETEX key seconds value将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
10SETNX key value只有在 key 不存在时设置 key 的值
11SETRANGE key offset value用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
12STRLEN key返回 key 所储存的字符串值的长度
13MSETNX key value [key value …]同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
14PSETEX key milliseconds value与 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间
15INCR key将 key 中储存的数字值增一
16INCRBY key increment将 key 所储存的值加上给定的增量值(increment)
17INCRBYFLOAT key increment将 key 所储存的值加上给定的浮点增量值(increment)
18DECR key将 key 中储存的数字值减一
19DECRBY key decrementkey 所储存的值减去给定的减量值(decrement)
20APPEND key value如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值 value 的末尾

实例:

127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 # 获取值
"v1"
127.0.0.1:6379> exists key1 # 判断key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" # 追加字符串 如果当前key不存在,则相当于set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key
(integer) 0
127.0.0.1:6379> strlen key1
(integer) 7
127.0.0.1:6379> append key1 "redis"
(integer) 12
127.0.0.1:6379> strlen key1
(integer) 12
127.0.0.1:6379> 
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 将 key 中储存的数字值增一
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> decr views # 将 key 中储存的数字值减一
(integer) 0
127.0.0.1:6379> incrby views 10 # 将 key 所储存的值加上给定的增量值(increment)
(integer) 10
127.0.0.1:6379> decrby views 5  # key 所储存的值减去给定的减量值(decrement)
(integer) 5
127.0.0.1:6379> set key1 "hello,redis"
OK
127.0.0.1:6379> get key1
"hello,redis"
127.0.0.1:6379> getrange key1 0 5 # 返回 key 中字符串值的子字符,[0,5],end=-1时表示全部
"hello,"
127.0.0.1:6379> set key2 asdfgh
OK
127.0.0.1:6379> get key2
"asdfgh"
127.0.0.1:6379> setrange key2 1 xx # 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
(integer) 6
127.0.0.1:6379> get key2
"axxfgh"
127.0.0.1:6379> setex key3 30 "hello" # 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
OK
127.0.0.1:6379> ttl key3
(integer) 22
127.0.0.1:6379> setnx mykey "redis" # 只有在 key 不存在时设置 key 的值
(integer) 1
127.0.0.1:6379> setnx mykey "mongodb"
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同时设置多个值 
OK
127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 # msetnx 是原子性的操作
(integer) 0
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 20
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "20"
127.0.0.1:6379> getset db redis # getset如果不存在值则返回nil,存在则先返回当前的值,在设置新的值
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb
"redis"
127.0.0.1:6379> get db
"mongodb"

List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

List类型一般用于关注人、简单队列等。

所有list命令都是l开头的

序号命令语法描述
1LPUSH key value1 [value2]将一个或多个值插入到列表头部
2LPOP key移出并获取列表的第一个元素
3LRANGE key start stop获取列表指定范围内的元素
4LPUSHX key value将一个值插入到已存在的列表头部
5RPUSH key value1 [value2]在列表中添加一个或多个值
6RPOP key移除列表的最后一个元素,返回值为移除的元素
7RPUSHX key value为已存在的列表添加值
8LLEN key获取列表长度
9LINSERT key BEFORE|AFTER pivot value在列表的元素前或者后插入元素
10LINDEX key index通过索引获取列表中的元素
11LSET key index value通过索引设置列表元素的值
12LREM key count value移除列表元素
13LTRIM key start stop对一个列表进行修剪,即让列表只保留指定区间内的元素, 不在指定区间之内的元素都将被删除
14BLPOP key1 [key2 ] timeout移出并获取列表第一个元素,如果列表没有元素会阻塞列表 直到等待超时或发现可弹出元素为止
15BRPOP key1 [key2 ] timeout移出并获取列表最后一个元素,如果列表没有元素会阻塞列表 直到等待超时或发现可弹出元素为止
16BRPOPLPUSH source destination timeout将列表中弹出的元素插入到另外一个列表中并返回 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
17RPOPLPUSH source destination移除列表最后一个元素,并将该元素添加到另一个列表并返回

实例

127.0.0.1:6379> lpush list one # 将一个或者多个值插入到列表的头部(左)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> rpush list right # 将一个或者多个值插入到列表的尾部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 1 # 通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list # 移除第一个元素
"three"
127.0.0.1:6379> rpop list # 移除最后一个元素
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 # 通过下标获取某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> llen list # 返回列表的长度
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrem list 1 two # 移除指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "one"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "one"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "one"
127.0.0.1:6379> lpush mylist "hello"
(integer) 1
127.0.0.1:6379> lpush mylist "hello1"
(integer) 2
127.0.0.1:6379> lpush mylist "hello12"
(integer) 3
127.0.0.1:6379> lpush mylist "hello13"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 # 通过下标截取指定的长度,list已经被改变,只剩下截取的元素了!
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello12"
2) "hello1"
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist # 移除列表的最后一个元素,将他移动到新的列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看原来列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1 # 查看新的列表中确实存在
1) "hello2"
127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "value1"
127.0.0.1:6379> lset list 0 item # 将列表中的指定下标的值替换为另一个值,更新操作,如果不存在列表去更新就会报错。存在就更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lpush mylist "hello"
(integer) 1
127.0.0.1:6379> lpush mylist "world"
(integer) 2
127.0.0.1:6379> linsert mylist before "world" "other" # 将某个具体的value插入到某个元素的前面或者后面
(integer) 3
127.0.0.1:6379> lrange list 0 -1
(empty array)
127.0.0.1:6379> lrange mylist 0 -1
1) "other"
2) "world"
3) "hello"
127.0.0.1:6379> linsert mylist after "world" "new"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "other"
2) "world"
3) "new"
4) "hello"

小结

  • 他实际上是一个链表,before Node after , left , right 都可以插入值如果key不存在,创建新的链表

  • 如果key存在,新增内容

  • 如果移除了所有值,空链表,也代表不存在!

  • 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点~

消息排队!消息队列( Lpush Rpop ) ,栈( Lpush Lpop )

set(集合)

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

Set类型一般用于赞、踩、标签、好友关系等。

序号命令语法描述
1SADD key member1 [member2]向集合添加一个或多个成员
2SMEMBERS key返回集合中的所有成员
3SCARD key获取集合的成员数
4SRANDMEMBER key [count]返回集合中一个或多个随机数
5SISMEMBER key member判断 member 元素是否是集合 key 的成员
6SREM key member1 [member2]移除集合中一个或多个成员
7SDIFF key1 [key2]返回给定所有集合的差集
8SDIFFSTORE destination key1 [key2]返回给定所有集合的差集并存储在 destination 中
9SINTER key1 [key2]返回给定所有集合的交集
10SINTERSTORE destination key1 [key2]返回给定所有集合的交集并存储在 destination 中
11SUNION key1 [key2]返回所有给定集合的并集
12SUNIONSTORE destination key1 [key2]所有给定集合的并集存储在 destination 集合中
13SMOVE source destination member将 member 元素从 source 集合移动到 destination 集合
14SPOP key移除并返回集合中的一个随机元素
15SSCAN key cursor [MATCH pattern] [COUNT count]迭代集合中的元素

实例:

127.0.0.1:6379> sadd myset "hello" # set集合中添加值
(integer) 1
127.0.0.1:6379> sadd myset "zs"
(integer) 1 
127.0.0.1:6379> smembers myset # 查看指定set的所有值
1) "hello"
2) "zs"
127.0.0.1:6379> sismember myset "hello" # 判断某一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> sismember myset "world"
(integer) 0
127.0.0.1:6379> scard myset # 获取set集合中的内容元素个数
(integer) 3
127.0.0.1:6379> srem myset hello # 移除set中指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "zs"
2) "lisi"
127.0.0.1:6379> srandmember myset # 随机抽选出元素
"zs"
127.0.0.1:6379> srandmember myset
"lisi"
127.0.0.1:6379> srandmember myset
"lisi"
127.0.0.1:6379> srandmember myset 2 # 随机抽选出指定个数元素
1) "zs"
2) "lisi"
127.0.0.1:6379> spop myset # 随机删除set中的一些元素
"lisi2"
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 lisi # 将一个指定的值,移动到另外一个set集合中
(integer) 1
127.0.0.1:6379> smembers myset2
1) "set2"
2) "lisi"
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2 # 差集
1) "a"
2) "b"
127.0.0.1:6379> sinter key1 key2 # 交集
1) "c"
127.0.0.1:6379> sunion key1 key2 # 并集
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"

微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!

共同关注,共同爱好,二度好友(六度分割理论)

Hash(哈希)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Map集合,key-map!时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的key-vlaue !

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

序号命令语法描述
1HSET key field value将哈希表 key 中的字段 field 的值设为 value
2HGET key field获取存储在哈希表中指定字段的值
3HGETALL key获取在哈希表中指定 key 的所有字段和值
4HEXISTS key field查看哈希表 key 中,指定的字段是否存在
5HSETNX key field value只有在字段 field 不存在时,设置哈希表字段的值
6HKEYS key获取所有哈希表中的字段
7HVALS key获取哈希表中所有值
8HLEN key获取哈希表中字段的数量
9HMGET key field1 [field2]获取所有给定字段的值
10HMSET key field1 value1 [field2 value2]同时将多个 field-value (域-值)对设置到哈希表 key 中
11HINCRBY key field increment为哈希表 key 中的指定字段的整数值加上增量 increment
12HINCRBYFLOAT key field increment为哈希表 key 中的指定字段的浮点数值加上增量 increment
13HDEL key field1 [field2]删除一个或多个哈希表字段
14HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的键值对

实例:

127.0.0.1:6379> hset myhash filed1 zhangsan # set一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash filed1 # 获取一个字段值
"zhangsan"
127.0.0.1:6379> hmset myhash filed1 hello filed2 world # set多个key-value
OK
127.0.0.1:6379> hmget myhash filed1 filed2 # 获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash # 获取全部的数据
1) "filed1"
2) "hello"
3) "filed2"
4) "world"
127.0.0.1:6379> hdel myhash filed1 # 删除hash指定的key字段,对应的value也没了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "filed2"
2) "world"
127.0.0.1:6379> hdel myhash filed1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "filed2"
2) "world"
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> hmset myhash filed1 hello
OK
127.0.0.1:6379> hlen myhash # 获取hash表的字段数量
(integer) 2
127.0.0.1:6379> hgetall myhash
1) "filed2"
2) "world"
3) "filed1"
4) "hello"
127.0.0.1:6379> hexists myhash filed1 # 判断hash中的字段是否存在
(integer) 1
127.0.0.1:6379> hexists myhash filed3
(integer) 0
127.0.0.1:6379> hkeys myhash # 获取所有的字段
1) "filed2"
2) "filed1"
127.0.0.1:6379> hvals myhash # 获取所有的值
1) "world"
2) "hello"
127.0.0.1:6379> hset myhash filed3 5 # 指定增量
(integer) 1
127.0.0.1:6379> hincrby myhash filed3 1
(integer) 6
127.0.0.1:6379> hincrby myhash filed3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash filed4 hello # 若不存在则可设置
(integer) 1
127.0.0.1:6379> hsetnx myhash filed4 world # 若存在则不可设置
(integer) 0

hash变更的数据user name age,尤其是是用户信息之类的,经常变动的信息! hash更适合于对象的存储,String更加适合字符串存储!

Zset(有序集合)

Redis 有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

Zset类型一般用于排行榜等。

序号命令语法描述
1ZADD key score1 member1 [score2 member2]向有序集合添加一个或多个成员,或者更新已存在成员的分数
2ZCARD key获取有序集合的成员数
3ZCOUNT key min max计算在有序集合中指定区间分数的成员数
4ZINCRBY key increment member有序集合中对指定成员的分数加上增量 increment
5ZLEXCOUNT key min max在有序集合中计算指定字典区间内成员数量
6ZRANGE key start stop [WITHSCORES]通过索引区间返回有序集合指定区间内的成员
7ZRANGEBYLEX key min max [LIMIT offset count]通过字典区间返回有序集合的成员
8ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]通过分数返回有序集合指定区间内的成员
9ZRANK key member返回有序集合中指定成员的索引
10ZREM key member [member …]移除有序集合中的一个或多个成员
11ZREMRANGEBYLEX key min max移除有序集合中给定的字典区间的所有成员
12ZREMRANGEBYRANK key start stop移除有序集合中给定的排名区间的所有成员
13ZREMRANGEBYSCORE key min max移除有序集合中给定的分数区间的所有成员
14ZREVRANGE key start stop [WITHSCORES]返回有序集中指定区间内的成员,通过索引,分数从高到低
15ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中指定分数区间内的成员,分数从高到低排序
16ZREVRANK key member返回有序集合中指定成员的排名, 有序集成员按分数值递减(从大到小)排序
17ZSCORE key member返回有序集中,成员的分数值
18ZINTERSTORE destination numkeys key [key …]计算给定的一个或多个有序集的交集 并将结果集存储在新的有序集合 key 中
19ZUNIONSTORE destination numkeys key [key …]计算给定的一个或多个有序集的并集,并存储在新的 key 中
20ZSCAN key cursor [MATCH pattern] [COUNT count]迭代有序集合中的元素(包括元素成员和元素分值)

实例:

127.0.0.1:6379> zadd myset 1 one # 添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two
(integer) 1
127.0.0.1:6379> zadd myset 3 three 4 four # 添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
# 排序实现
127.0.0.1:6379> zadd salary 2500 xiaohong # 添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 5500 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 8000 lisi
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf # 显示全部用户 从小到大排序
1) "xiaohong"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> zrevrange salary 0 -1  # 显示全部用户 从大到小排序
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 显示全部用户 并且附带成绩
1) "xiaohong"
2) "2500"
3) "zhangsan"
4) "5500"
5) "lisi"
6) "8000"
127.0.0.1:6379> zrangebyscore salary -inf 5000  withscores # 显示工资小于5000的用户升序 并且附带成绩
1) "xiaohong"
2) "2500"
127.0.0.1:6379> zrange salary 0 -1
1) "xiaohong"
2) "zhangsan"
3) "lisi"
127.0.0.1:6379> zrem salary xiaohong # 移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> zcard salary # 获取有序集合中的个数
(integer) 2
127.0.0.1:6379> zadd myset 1 hello 2 wolrd 3 zhangsan
(integer) 3
127.0.0.1:6379> zcount myset 1 3 # 获取指定区间成员的数量
(integer) 3

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

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

相关文章

yolov8热力图可视化

安装pytorch_grad_cam pip install grad-cam自动化生成不同层的bash脚本 # 循环10次,将i的值从0到9 for i in $(seq 0 13) doecho "Running iteration $i";python yolov8_heatmap.py $i; done热力图生成python代码 import warnings warnings.filterwarn…

vscode流程图插件使用

vscode流程图插件使用 1.在vscode中点击左下角设置然后选择扩展。 2.在扩展中搜索Draw.io Integration,安装上面第一个插件。 3.安装插件后在工程中创建一个后缀为drawio的文件并且双击打开即可绘制流程图

2023-08-26 LeetCode每日一题(汇总区间)

2023-08-26每日一题 一、题目编号 228. 汇总区间二、题目链接 点击跳转到题目位置 三、题目描述 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖…

如何在地图上寻找最密集点的位置?

最近我在工作中遇到了一个小的需求点,大概是需要在地图上展示出一堆点中的点密度最密集的位置。最开始没想到好的方法,就使用了一个非常简单的策略——所有点的坐标求平均值,这个方法大部分的时候好用,因为大部分城市所有点位基本…

深度学习4. 循环神经网络 – Recurrent Neural Network | RNN

目录 循环神经网络 – Recurrent Neural Network | RNN 为什么需要 RNN ?独特价值是什么? RNN 的基本原理 RNN 的优化算法 RNN 到 LSTM – 长短期记忆网络 从 LSTM 到 GRU RNN 的应用和使用场景 总结 百度百科维基百科 循环神经网络 – Recurre…

【手写promise——基本功能、链式调用、promise.all、promise.race】

文章目录 前言一、前置知识二、实现基本功能二、实现链式调用三、实现Promise.all四、实现Promise.race总结 前言 关于动机,无论是在工作还是面试中,都会遇到Promise的相关使用和原理,手写Promise也有助于学习设计模式以及代码设计。 本文主…

WPF基础入门-Class5-WPF命令

WPF基础入门 Class5-WPF命令 1、xaml编写一个button&#xff0c;Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…

【LeetCode-面试经典150题-day15】

目录 104.二叉树的最大深度 100.相同的树 226.翻转二叉树 101.对称二叉树 105.从前序与中序遍历序列构造二叉树 106.从中序与后序遍历序列构造二叉树 117.填充每个节点的下一个右侧节点指针Ⅱ 104.二叉树的最大深度 题意&#xff1a; 给定一个二叉树 root &#xff0c;返回其…

STM32F103 4G Cat.1模块EC200S使用

一、简介 EC200S-CN 是移远通信最近推出的 LTE Cat 1 无线通信模块&#xff0c;支持最大下行速率 10Mbps 和最大上行速率 5Mbps&#xff0c;具有超高的性价比&#xff1b;同时在封装上兼容移远通信多网络制式 LTE Standard EC2x&#xff08;EC25、EC21、EC20 R2.0、EC20 R2.1&a…

用大白话来讲讲多线程的知识架构

感觉多线程的知识又多又杂&#xff0c;自从接触java&#xff0c;就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程&#xff1f; 操作系统运行一个程序&#xff0c;就是一个线程。同时运行多个程序&#xff0c;就是多线程。即在同一时间&#xff0…

基于FPGA的Lorenz混沌系统verilog开发,含testbench和matlab辅助测试程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将vivado的仿真结果导入到matlab显示三维混沌效果&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 testbench如下所…

npm常用命令 + 前端常用的包管理工具 以及 npm淘宝镜像配置等

npm常用命令 前端常用的包管理工具 以及 npm淘宝镜像配置等 1. 前言1.1 NodeJs的下载安装1.2 windows上1.3 常用包管理工具 2. npm2.1 npm 的安装2.2 npm初始化包2.3 npm 安装、卸载包2.3.1 非全局安装2.3.1.1 单个包的安装2.3.1.1.1 默认版本安装2.3.1.1.2 指定版本安装 2.3.…

解除用户账户控制提醒

解决用户账户控制提醒 1. 前言2. 解决用户账户控制提醒2.1 控制面板2.2 注册表2.3 UAC服务 结束语 1. 前言 当我们使用电脑时&#xff0c;有时进行安装应用或者打开应用时&#xff0c;总会弹出一个提示框&#xff0c;要选择点击是否允许程序运行&#xff1b; 系统经常弹出用户…

【Git】测试持续集成——Git+Gitee+PyCharm

文章目录 概述一、使用Gitee1. 注册账号2. 绑定邮箱3. 新建仓库4. 查看项目地址 二、安装配置Git1. 下载安装包2. 校验是否安装成功。3. 配置Git4. Git命令5. Git实操 三、PyCharmGit1. 配置Git2. Clone项目3. 提交文件到服务器4. 从服务器拉取文件 概述 持续集成&#xff08;…

【javaweb】学习日记Day4 - Maven 依赖管理 Web入门

目录 一、Maven入门 - 管理和构建java项目的工具 1、IDEA如何构建Maven项目 2、Maven 坐标 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;主要组成 3、IDEA如何导入和删除项目 二、Maven - 依赖管理 1、依赖配置 2、依赖传递 &#xff08;1&#xff09;查…

Docker容器学习:Dockerfile制作Web应用系统nginx镜像

目录 编写Dockerfile 1.文件内容需求&#xff1a; 2.编写Dockerfile&#xff1a; 3.开始构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 推送镜像到私有仓库 1.把要上传的镜像打上合适的标签 2.登录harbor仓库 3.上传镜像 编写Dockerfile 1.文…

2000-2021年地级市产业升级、产业结构高级化面板数据

2000-2021年地级市产业升级、产业结构高级化面板数据 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;地级市 3、指标&#xff1a;年份、地区、行政区划代码、地区、所属省份、地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二…

常见的时序数据库

1.概念 时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签&#xff08;按照时间的顺序变化&#xff0c;即时间序列化&#xff09;的数据&#xff0c;带时间标签的数据也称为时间序列数据。 时间序列数据主要由电力行业、化工行业、气象行业、地理信息…

十四、pikachu之XSS

文章目录 1、XSS概述2、实战2.1 反射型XSS&#xff08;get&#xff09;2.2 反射型XSS&#xff08;POST型&#xff09;2.3 存储型XSS2.4 DOM型XSS2.5 DOM型XSS-X2.6 XSS之盲打2.7 XSS之过滤2.8 XSS之htmlspecialchars2.9 XSS之href输出2.10 XSS之JS输出 1、XSS概述 Cross-Site S…

分享一种针对uni-app相对通用的抓包方案

PART1&#xff0c;前言 近年来混合开发APP逐渐成为主流的开发模式&#xff0c;与传统的开发模式相比混合开发极大的提升了开发效率&#xff0c;同时跨平台的特性也降低了开发成本&#xff0c;一直以来混合开发被诟病的性能问题随着技术的发展也得到改善。技术的发展往往是一把…