4.Redis五大数据类型

  • Post author:
  • Post category:其他




五大数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JxrbFufQ-1641365837953)(image/image-20200901133302304.png)]

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作

数据库、缓存和消息中间件MQ

。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(

lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)即集群搭建。



1. Redis-Key



1、常用命令

# 连接redis客户端
[root@iZuf67rdcsn46d295zbgomZ ~]# redis-cli -p 6379

# 测试是否能拼通
127.0.0.1:6379> ping
PONG

# 清空所有数据
127.0.0.1:6379> flushall
OK

# 查看当前数据库中的所有的key
127.0.0.1:6379> keys *
(empty array)



2、set 设置key

############################### set 设置key值 ###################################
# 设置key
127.0.0.1:6379> set name zhangsan  
OK
127.0.0.1:6379> keys *
1 ) "name"
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1 ) "age"
2 ) "name"



3、EXISTS 判断当前的key是否存在

########################## EXISTS 判断当前的key是否存在 ############################
# 判断当前的key是否存在
127.0.0.1:6379> EXISTS name  
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0



4、move 移动key

########################### move 移动key ##################################
# 移动当前的key至其它数据库
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> EXISTS name
(integer) 0
# 切换数据库
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"

# 清除屏幕
127.0.0.1:6379> clear

# 切换数据库
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "age"
# 设置值
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"lisi"



5、EXPIRE 设置key的过期时间

########################### EXPIRE 设置key的过期时间 ##############################
# 设置key的过期时间,单位是秒(设置热点数据,一定时间内过期,例如单点登录)
127.0.0.1:6379> EXPIRE name 10 
# 设置成功
(integer) 1
# 查看当前key的剩余时间
127.0.0.1:6379> ttl name  
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
# key已过期
(integer) -2
# 获取key
127.0.0.1:6379> get name
# 数据库中没有此key
(nil)



6、del 移除key

############################### del 移除key #################################
# 查看所有的key
127.0.0.1:6379> keys *
1) "age"
# 移除 key
127.0.0.1:6379> del age
# 移除成功
(integer) 1 
127.0.0.1:6379> keys *
(empty array)



7、type 查看当前key的类型

############################## type 查看当前key的类型 #################################
# 查看所有的key
127.0.0.1:6379> keys *
(empty array)
# 设置值
127.0.0.1:6379> set name zs
OK
127.0.0.1:6379> set age 1
OK
# 查看当前key的类型
127.0.0.1:6379> type name
# 字符串类型
string
127.0.0.1:6379> type age
string

可以参考官网上的常用命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuxRgbsX-1641365837958)(image/image-20200901162153920.png)]



2. String 字符串类型



1、set设置值 get获取值 EXISTS判断key是否存在

################################### set 设置值 #######################################
# 设置值
127.0.0.1:6379> set key1 v1  
OK

################################### get 设置值 ####################################
# 获得值
127.0.0.1:6379> get key1 
"v1"

############################### keys 获得所有的key #################################
# 获得所有的key
127.0.0.1:6379> keys * 
1 ) "key1"

############################### EXISTS 判断key是否存在 ##############################
# 判断某一个key是否存在
127.0.0.1:6379> EXISTS key1  
(integer) 1



2、APPEND追加字符串 STRLEN获取字符串的长度

############################# APPEND 追加字符串 #################################
# 追加字符串,如果当前key不存在,就相当于set key
127.0.0.1:6379> APPEND key1 "hello" 
(integer) 7
# 获取值
127.0.0.1:6379> get key1
"v1hello"

############################# STRLEN 获取字符串的长度 ###############################
# 获取字符串的长度
127.0.0.1:6379> STRLEN key1  
(integer) 7
# 追加字符串
127.0.0.1:6379> APPEND key1 ",world"
(integer) 13
# 获取值
127.0.0.1:6379> get key1
"v1hello,world"
# 获取字符串的长度
127.0.0.1:6379> strlen key1
(integer) 13



3、incr值自增 decr值自减 INCRBY/DECRBY 设置步长,指定增减量

################################# 设置值 #######################################
# 初始浏览量为 0
127.0.0.1:6379> set views 0 
OK
127.0.0.1:6379> get views
"0"

################################## incr 值自增 ##################################
# 类似于 i++ , 步长 i+=
# 自增 1 浏览量变为 1
127.0.0.1:6379> incr views  
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"

################################## decr 值自减 ####################################
# 自减 1 浏览量-1
127.0.0.1:6379> decr views  
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"

########################### INCRBY/DECRBY 设置步长,指定增减量 ##########################
# 可以设置步长,指定增量
127.0.0.1:6379> INCRBY views 10 
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19
# 可以设置步长,指定减量
127.0.0.1:6379> DECRBY views 5
(integer) 14



4、GETRANGE 获取指定范围的字符串

##############################GETRANGE 获取指定范围的字符串#################################
# 获取所有key
127.0.0.1:6379> keys *
(empty array)
# 设置值
127.0.0.1:6379> set key1 "hello world"
OK
# 获取值
127.0.0.1:6379> get key1
"hello world"
# 查看字符串的长度
127.0.0.1:6379> strlen key1
(integer) 11
# 截取指定范围的字符串( 闭区间[0,3] )
127.0.0.1:6379> getrange key1 0 3
"hell"
# 截取指定范围的字符串( 闭区间[0,-1] )当第二个参数设置为-1时,即截取全部字符串,与get key是一样效果
127.0.0.1:6379> getrange key1 0 -1
"hello world"



5、SETRANGE 字符串替换

############################# SETRANGE 字符串替换  #################################
# 设置值
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
# 替换指定位置开始的字符串
127.0.0.1:6379> SETRANGE key2 1 xx  
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"



6、setex (set with expire) 设置过期时间



setnx (set if not exist) 不存在再设置(在分布式锁中会常常使用)

####################### 设置过期时间 setex (set with expire)  ##########################
# 获取所有key
127.0.0.1:6379> keys *
(empty array)

# 设置key1 的值为 hello,30秒后过期
127.0.0.1:6379> setex key1 30 "hello"
OK
# 查看当前key的剩余时间
127.0.0.1:6379> ttl key1
(integer) 25
# 获取key1的值
127.0.0.1:6379> get key1
"hello"

####################### 不存在再设置  setnx (set if not exist)  ########################
# 如果key2不存在,创建key2
127.0.0.1:6379> setnx key2 "world"
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
# 如果key2存在,创建失败
127.0.0.1:6379> setnx key2 "redis"
(integer) 0
127.0.0.1:6379> get key2
"world"



7、mset批量设置值 mget批量获取值

############################## mset和mget 批量操作 ####################################
# 同时设置多个值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
# 同时获取多个值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

######################### msetnx 批量为不存在的元素设置值  #################################
# 同时为不存在的再设置值,msetnx是一个原子性的操作,要么一起成功,要么一起失败
127.0.0.1:6379> msetnx k1 v1 k4 v4 
# k1和k4皆设置失败
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"



8、设置对象

############################## 对象  ###################################

# 第一种方式:用json字符串保存一个对象信息 user:{id} {field:value,field:value} 
# 设置user:1对象的值 , 若设置同名的对象,则会发生覆盖
127.0.0.1:6379> set user:1 {name:zs,age:10}
OK
# 获取user:1对象的值
127.0.0.1:6379> get user:1
"{name:zs,age:10}"

# 第二种方式:批量分别设置对象的值的方式 user:{id}:{field} {value}
# 同时设置user:2:name 和 user:2:age 
127.0.0.1:6379> mset user:2:name lisi user:2:age 20
OK
# 同时获取user:2:name 和 user:2:age 
127.0.0.1:6379> mget user:2:name user:2:age
1) "lisi"
2) "20"



9、getset 获取旧值并设置新值

######################### getset 获取旧值并设置新值  ############################
# 如果不存在值,则返回 nil
127.0.0.1:6379> getset key1 hello
(nil)
# 如果存在值,获取原来的值,并设置新的值
127.0.0.1:6379> getset key1 world
"hello"
# 获取值,已经是最新的值
127.0.0.1:6379> get key1
"world"



10、使用场景

value除了是我们的字符串还可以是我们的数字

计数器  例如:INCRBY
统计多单位的数量  例如:批量对象属性的值存储  user:{id}:{field} {value}
粉丝数
对象缓存存储



3. List 列表

在redis里面,我们可以把list当作栈、队列、阻塞队列。所有的list命令都是用 L 开头的,

Redis不区分大小命令



1、LPUSH左边添加值 RPUSH右边添加值

# 清空数据库
127.0.0.1:6379> flushdb
OK
# 查看所有key
127.0.0.1:6379> keys *
(empty array)

############################# LPUSH 左边添加值 ##########################
# 将一个值或者多个值,插入到列表头部 (左)
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

############################# LRANGE 闭区间获取值 ##########################
# 通过区间获取list具体的值,设置为-1代表取到最后
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
# 通过区间获取list具体的值 [0,1]闭区间
127.0.0.1:6379> LRANGE list 0 1
1) "three"
2) "two"

############################# RPUSH 右边添加值 ##########################
# 将一个值或者多个值,插入到列表位部 (右)
127.0.0.1:6379> RPUSH list right
(integer) 4
# 通过区间获取具体的值,设置为-1代表取到最后
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"



2、LPOP移除并返回最左边元素 RPOP移除并返回最右边元素

# 查询list列表中的所有元素
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"

############################ LPOP 移除并返回最左边元素 ############################
# 移除list的第一个元素
127.0.0.1:6379> LPOP list
"three"

############################ RPOP 移除并返回最右边元素 ############################
# 移除list的最后一个元素
127.0.0.1:6379> RPOP list
"right"

# 查询list列表中的所有元素
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"



3、Lindex 通过下标获取值

############################# Lindex 通过下标获取值 ##############################
# 查询list列表中的所有元素
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"

# 通过下标获得 list 中的某一个值
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> lindex list 1
"one"



4、Llen 返回列表的长度

############################## Llen 返回列表的长度 #################################
# 清空当前数据库
127.0.0.1:6379> flushdb
OK

# 给list列表传入值
127.0.0.1:6379> LPUSH list 111
(integer) 1
127.0.0.1:6379> LPUSH list 222
(integer) 2
127.0.0.1:6379> LPUSH list 333
(integer) 3

# 返回list列表的长度
127.0.0.1:6379> LLEN list
(integer) 3



5、Lrem 移除指定的值

############################## Lrem 移除指定的值 ###############################
# 给list列表中存入重复值
127.0.0.1:6379> LPUSH list 333
(integer) 4
# 查看list列表中所有值,列表中允许存放同一值
127.0.0.1:6379> LRANGE list 0 -1
1) "333"
2) "333"
3) "222"
4) "111"
# 移除list集合中指定 个数 的 value,精确匹配
# 移除一个"111"的值
127.0.0.1:6379> LREM list 1 111
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "333"
2) "333"
3) "222"
# 移除两个"333"的值
127.0.0.1:6379> LREM list 2 333
(integer) 2
# 查看list列表中所有值
127.0.0.1:6379> LRANGE list 0 -1
1) "222"



6、Ltrim 截取

################################ Ltrim 截取 ######################################
# 清空当前数据库
127.0.0.1:6379> flushdb
OK
# 查询所有key
127.0.0.1:6379> keys *
(empty array)

# 向list列表右边添加值
127.0.0.1:6379> RPUSH list aaa
(integer) 1
127.0.0.1:6379> RPUSH list bbb
(integer) 2
127.0.0.1:6379> RPUSH list ccc
(integer) 3
127.0.0.1:6379> RPUSH list ddd
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "aaa"
2) "bbb"
3) "ccc"
4) "ddd"

# 通过下标截取指定的位置(闭区间),这个list已经被改变了,截断了只剩下截取的元素
127.0.0.1:6379> LTRIM list 1 2
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "bbb"
2) "ccc"



7、 rpoplpush 移除原列表的最右边元素,并添加到新列表的最左边

######################### rpoplpush 原列表 目标列表 #########################
# 清空当前数据库
127.0.0.1:6379> flushdb
OK

# 给mylist列表最右边添加值
127.0.0.1:6379> RPUSH mylist aaa
(integer) 1
127.0.0.1:6379> RPUSH mylist bbb
(integer) 2
127.0.0.1:6379> RPUSH mylist ccc
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "aaa"
2) "bbb"
3) "ccc"

# 移除列表的最右边元素,将他移动到新列表的最左边
127.0.0.1:6379> RPOPLPUSH mylist myother
"ccc"
# 查看原列表中的元素
127.0.0.1:6379> LRANGE mylist 0 -1
1) "aaa"
2) "bbb"
# 查看目标列表中的元素
127.0.0.1:6379> LRANGE myother 0 -1
1) "ccc"

# 移除列表的最右边元素,将他移动到新列表的最左边
127.0.0.1:6379> RPOPLPUSH mylist myother
"bbb"
# 查看原列表中的元素
127.0.0.1:6379> LRANGE mylist 0 -1
1) "aaa"
# 查看原列表中的元素
127.0.0.1:6379> LRANGE myother 0 -1
1) "bbb"
2) "ccc"



8、Lset 更新当前下标的值,若当前列表不存在更新则会报错

################ Lset 将列表中指定下标的值替换为另外一个值,更新操作 ####################
# 判断这个列表是否存在
127.0.0.1:6379> EXISTS list 
(integer) 0

# 如果列表不存在,更新会报错
127.0.0.1:6379> lset list 0 aaa
(error) ERR no such key
# 先给列表中存入元素
127.0.0.1:6379> lpush list aaa
(integer) 1
# 查看列表中所有元素
127.0.0.1:6379> LRANGE list 0 -1
1) "aaa"
# 如果列表存在,更新当前下标的值
127.0.0.1:6379> lset list 0 bbb
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "bbb"

# 如果列表对应下标不存在值,则会报错
127.0.0.1:6379> lset list 1 ccc
(error) ERR index out of range



9、Linsert 将某个具体的value插入到列表中某个元素的前面或者后面

############## linsert 将某个具体的value插入到列表中某个元素的前面或者后面 ##############
# 清空数据库
127.0.0.1:6379> flushdb
OK
# 查看所有key
127.0.0.1:6379> keys *
(empty array)

# 在列表的最右边添加元素
127.0.0.1:6379> rpush list aaa
(integer) 1
127.0.0.1:6379> rpush list bbb
(integer) 2
127.0.0.1:6379> rpush list bbb
(integer) 3
# 查看列表中的所有元素
127.0.0.1:6379> LRANGE list 0 -1
1) "aaa"
2) "bbb"
3) "bbb"

# 在指定的列表元素前面添加值
127.0.0.1:6379> LINSERT list before bbb hello
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "aaa"
2) "hello"
3) "bbb"
4) "bbb"

# 在指定的列表元素后面添加值
127.0.0.1:6379> LINSERT list after bbb world
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "aaa"
2) "hello"
3) "bbb"
4) "world"
5) "bbb"



10、使用场景

1).List实际上是一个链表,before Node after , left,right 都可以插入值

2).如果key不存在,创建新的链表;如果key存在,新增内容

3).如果移除了所有值,则是空链表,说明不存在了

5).在两边插入或者改动值,效率最高;若是中间元素,相对来说效率会低一点

6).可以使用List实现消息排队、消息队列 (Lpush Rpop)、 栈( Lpush Lpop)



4. Set 无序不重复集合



1、sadd 添加元素

#############################sadd 给set集合添加元素 ########################################
# 清空数据库
127.0.0.1:6379> flushall
OK

# 添加元素
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset redis
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
# 添加重复元素,返回0代表添加失败
127.0.0.1:6379> sadd myset hello
(integer) 0

########################## SMEMBERS 查看指定set集合的所有值 ###########################
# 查看集合中所有值
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
3) "redis"



2、SISMEMBER 判断某一个值是不是在set集合中

##################### SISMEMBER 判断某一个值是不是在set集合中 ########################
# 判断集合中是否存在某个值,返回1则存在,返回0则不存在
127.0.0.1:6379> SISMEMBER myset hello
(integer) 1
127.0.0.1:6379> SISMEMBER myset aaa
(integer) 0



3、scard 获取集合中的内容元素个数

######################### scard 获取集合中的内容元素个数 ############################
127.0.0.1:6379> SCARD myset
(integer) 3
127.0.0.1:6379> SADD myset aaa
(integer) 1
127.0.0.1:6379> SCARD myset
(integer) 4



4、srem 移除set集合中的指定元素

######################### srem 移除set集合中的指定元素 #############################
# 查看集合中所有元素
127.0.0.1:6379> SMEMBERS myset
1) "aaa"
2) "hello"
3) "world"
4) "redis"
# 移除set集合中的指定元素
127.0.0.1:6379> srem myset aaa
(integer) 1
# 查看集合中所有元素
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
3) "redis"



5、SRANDMEMBER 随机抽选出一个元素

########################### SRANDMEMBER 随机抽选出一个元素 #########################
# 查看集合中所有元素
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
3) "redis"

# 随机抽选出一个元素
127.0.0.1:6379> SRANDMEMBER myset
"hello"
127.0.0.1:6379> SRANDMEMBER myset
"redis"

# 随机抽选出指定个数的元素
127.0.0.1:6379> SRANDMEMBER myset 2
1) "redis"
2) "world"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "hello"
2) "world"



6、spop 删除key,随机删除key

############################# spop 随机删除key #########################
# 查看集合中所有元素
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
3) "redis"

# 随机弹出key并返回
127.0.0.1:6379> SPOP myset
"hello"
127.0.0.1:6379> SPOP myset
"world"

# 查看集合中所有元素
127.0.0.1:6379> SMEMBERS myset
1) "redis"



7、smove 将一个指定的值,移动到另外一个set集

######################## smove 将一个指定的值,移动到另外一个set集 #####################
# 清空数据库
127.0.0.1:6379> flushdb
OK

# 给myset集合添加元素
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset redis
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
# 查看myset集合中的所有元素
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
3) "redis"

# 给myother集合添加元素
127.0.0.1:6379> sadd myother other
(integer) 1
# 查看myother集合中的所有元素
127.0.0.1:6379> SMEMBERS myother
1) "other"

# 将myset集合中的元素,移动至myother中
127.0.0.1:6379> SMOVE myset myother redis
(integer) 1

# 此时myset集合元素少了redis元素
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
# 此时myother集合元素多了redis元素
127.0.0.1:6379> SMEMBERS myother
1) "redis"
2) "other"



8、使用场景

例如:微博、B站、抖音都有

共同关注

这个功能,实际上是数学上

交集

的概念。

数字集合类:

  • 差集 SDIFF
  • 交集 SINTER
  • 并集 SUNION
# 清空屏幕
127.0.0.1:6379> clear

# 清空数据库
127.0.0.1:6379> flushdb
OK

# set1集合 添加元素
127.0.0.1:6379> sadd set1 a
(integer) 1
127.0.0.1:6379> sadd set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1

# set2集合 添加元素
127.0.0.1:6379> sadd set2 c
(integer) 1
127.0.0.1:6379> sadd set2 d
(integer) 1
127.0.0.1:6379> sadd set2 e
(integer) 1

# 查看set1集合元素
127.0.0.1:6379> SMEMBERS set1
1) "c"
2) "a"
3) "b"
# 查看set2集合元素
127.0.0.1:6379> SMEMBERS set2
1) "d"
2) "e"
3) "c"

# 差集:以set1为主,查看与set2集合不同的元素
127.0.0.1:6379> SDIFF set1 set2
1) "a"
2) "b"

# 交集:查看集合set1和set2的共同元素,例如共同好友就可以这样实现
127.0.0.1:6379> SINTER set1 set2
1) "c"

# 并集:查看集合set1和set2的所有元素
127.0.0.1:6379> SUNION set1 set2
1) "a"
2) "c"
3) "b"
4) "d"
5) "e"

使用场景:例如微博,A用户将所有关注的人放在一个set集合中,将它的粉丝也放在一个set集合中。其中共同关注,共同爱好,二度好友,推荐好友(六度分割理论)



5. Hash 哈希

类似于map集合,本质和String类型没有太大区别,还是一个简单的key-value。



1、hset设置值 hget获取值

############################## hset设置值  hget获取值 ###########################
# hset设置值
127.0.0.1:6379> hset myhash f1 hello
(integer) 1
127.0.0.1:6379> hset myhash f2 world
(integer) 1
127.0.0.1:6379> hset myhash f3 redis
(integer) 1

# hget获取值
127.0.0.1:6379> hget myhash f2
"world"



2、hmset批量设置值 hmget批量获取值

########################## hmset批量设置值  hmget批量获取值 ########################
# hmset批量设置值
127.0.0.1:6379> hmset myhash f1 aaa f2 bbb f3 ccc
OK

# hmget批量获取值
127.0.0.1:6379> hmget myhash f1 f2 f3
1) "aaa"
2) "bbb"
3) "ccc"



3、hgetall 获取全部的数据

############################ hgetall 获取全部的数据 ###############################
# hset设置值,若key存在则发生覆盖
127.0.0.1:6379> hset myhash f1 zhangsan
(integer) 0
# 获取全部数据
127.0.0.1:6379> hgetall myhash
1) "f1"
2) "zhangsan"
3) "f2"
4) "bbb"
5) "f3"
6) "ccc"

# hset设置值,若key不存在则直接存入
127.0.0.1:6379> hset myhash f4 ddd
(integer) 1
# 获取全部数据
127.0.0.1:6379> hgetall myhash
1) "f1"
2) "zhangsan"
3) "f2"
4) "bbb"
5) "f3"
6) "ccc"
7) "f4"
8) "ddd"



4、hdel 删除hash指定key字段,对应的value值也就消失

#################### hdel 删除hash指定key字段,对应的value值也就消失 #################
# 删除hash的指定key,值也一并删除
127.0.0.1:6379> hdel myhash f1
(integer) 1
# 获取全部数据
127.0.0.1:6379> hgetall myhash
1) "f2"
2) "bbb"
3) "f3"
4) "ccc"
5) "f4"
6) "ddd"



5、hlen 获取hash表的字段数量

############################ hlen 获取hash表的字段数量 ###############################
# 查看hash中的键值对数量
127.0.0.1:6379> hlen myhash
(integer) 3



6、HEXISTS 判断hash中指定字段是否存在

######################### HEXISTS 判断hash中指定字段是否存在 ##########################
# HEXISTS判断hash中是否存在指定的key,不存在则返回0
127.0.0.1:6379> HEXISTS myhash f1
(integer) 0
# HEXISTS判断hash中是否存在指定的key,存在则返回1
127.0.0.1:6379> HEXISTS myhash f2
(integer) 1



7、hkeys只获得所有field,hvals只获得所有value

############################## hkeys 只获得所有键key ###############################
127.0.0.1:6379> hkeys myhash
1) "f2"
2) "f3"
3) "f4"

############################## hvals 只获得所有值value ################################
127.0.0.1:6379> hvals myhash
1) "bbb"
2) "ccc"
3) "ddd"



8、hincrby 设置增量,若是正数则增加,若是负数则减少

# 设置值
127.0.0.1:6379> hset myhash f5 5
(integer) 1
# 获取值
127.0.0.1:6379> hget myhash f5
"5"

# 设置正数,给指定属性自增值
127.0.0.1:6379> HINCRBY myhash f5 2
(integer) 7
127.0.0.1:6379> hget myhash f5
"7"
# 设置负数,给指定属性自减值
127.0.0.1:6379> HINCRBY myhash f5 -2
(integer) 5
127.0.0.1:6379> hget myhash f5
"5"



9、hsetnx 设置值时,若key已存在则失败返回0,不存在则成功返回1

# 设置值时,若key不存在则成功返回1
127.0.0.1:6379> hsetnx myhash f6 aaa 
(integer) 1
127.0.0.1:6379> hget myhash f6
"aaa"
# 设置值时,若key已存在则失败返回0
127.0.0.1:6379> HSETNX myhash f6 bbb
(integer) 0
127.0.0.1:6379> hget myhash f6
"aaa"



10、使用场景

​ hash最多的应用是存储变更的数据,例如将user作为键,name age作为值进行存储,尤其是是用户信息之类的,经常变动的信息。

hash 更适合于对象的存储,String更加适合字符串存储。

# 清空数据库
127.0.0.1:6379> flushdb
OK

# 设置user对象的单个属性的值
127.0.0.1:6379> hset user:1 name zs
(integer) 1
# 获取user对象的单个属性的值
127.0.0.1:6379> hget user:1 name
"zs"

# 批量设置user对象的多个属性的值
127.0.0.1:6379> hmset user:2 name lisi age 10
OK
# 批量获取user对象的多个属性的值
127.0.0.1:6379> hmget user:2 name age
1) "lisi"
2) "10"



6. Zset 有序集合

在set的基础上,增加了一个标志,此标志可以让值进行排序 ,语法:

zadd key score member



1、zadd 添加 zrange 查看

# 添加单个元素
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
127.0.0.1:6379> zadd myzset 3 three
(integer) 1
# 添加多个元素
127.0.0.1:6379> zadd myzset 4 four 5 five
(integer) 2
# 查看指定下标范围的元素
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"



2、ZRANGEBYSCORE 实现升序 ZREVRANGEBYSCORE 实现降序

# 清空数据库
127.0.0.1:6379> flushdb
OK

# 添加元素
127.0.0.1:6379> zadd salary 2000 zs
(integer) 1
127.0.0.1:6379> zadd salary 3000 lisi
(integer) 1
127.0.0.1:6379> zadd salary 1500 wang
(integer) 1

# 根据salary字段升序排列
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "wang"
2) "zs"
3) "lisi"
# 根据salary字段降序排列
127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf
1) "lisi"
2) "zs"
3) "wang"

# 根据salary字段升序排列,显示全部信息(包括名称、薪资)
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "wang"
2) "1500"
3) "zs"
4) "2000"
5) "lisi"
6) "3000"
# 根据salary字段降序排列,显示全部信息(包括名称、薪资)
127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf withscores
1) "lisi"
2) "3000"
3) "zs"
4) "2000"
5) "wang"
6) "1500"

# 根据salary字段升序排列,按照指定范围,显示全部信息(包括名称、薪资)
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores
1) "wang"
2) "1500"
3) "zs"
4) "2000"



3、zrem 移除

# 查看指定下标范围的元素
127.0.0.1:6379> ZRANGE salary 0 -1
1) "wang"
2) "zs"
3) "lisi"

# 移除元素
127.0.0.1:6379> zrem salary zs
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "wang"
2) "lisi"



4、zcard 获取有序集合中元素的个数

# 获取有序集合中元素的个数
127.0.0.1:6379> zcard salary
(integer) 2



5、zcount 获取集合中指定区间的元素个数

# 获取指定区间的元素个数
127.0.0.1:6379> zcount salary 500 1500
(integer) 1
127.0.0.1:6379> zcount salary 500 3000
(integer) 2



6、使用场景


zset 即是对set排序

1). 可以存储班级成绩表、工资表排序等

2). 带权重进行判断:普通消息 1 ,重要消息 2

3). 实现排行榜应用:将播放量或评分放进有序集合中进行遍历, 或者取TopN测试



版权声明:本文为weixin_45874347原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。