Redis篇(数据类型)

目录

讲解一:简介

讲解二:常用

一、String类型

1. 简介

2. 常见命令

3. Key结构

4. 操作String

5. 实例

二、Hash类型

1. 简介

2. 常见命令

3. 3操作hash

4. 实例

三、List类型

1. 简介

2. 特征

3. 应用场景

4. 常见命令

5. 操作list

6. 实例

四、Set类型

1. 简介

2. 特征

3. 常见命令

4. 操作set

5. 练习

6. 实例

五、SortedSet类型

1. 简介

2. 特征

3. 应用场景

4. 常见命令

5. 操作sorted set

6. 练习题

7. 实例

六、通用命令

1. 简介

2. 设置key的失效时间

3. 删除

4. 实例

七、Key的层级结构

1. 简介

2. 常见命令

3. 案例

八、总结


讲解一:简介

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:

贴心小建议:命令不要死记,学会查询就好啦

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网

( Commands | Docs )可以查看到不同的命令:

当然我们也可以通过Help命令来帮助我们去查看命令

讲解二:常用

官网可以查看到不同的命令:https://redis.io/commands 

Redis是典型的key-value数据库,key一般是字符串,而value则可以包含很多不同的数据类型,

如下是列举出来的一些常用命令。

不同类型的命令称为一个group,我们也可以通过help命令来查看各种不同group的命令:

接下来,我们就学习常见的五种基本数据类型的相关命令。

一、String类型

1. 简介

String类型,也就是字符串类型,是 Redis 中最简单的存储类型。

其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.

2. 常见命令

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

更多命令可以参考Redis中文网:Redis中文网

3. Key结构

Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?

例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,

此时如果使用id作为key,那就会冲突了,该怎么办?

我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:

Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:

项目名:业务名:类型:id

这个格式并非固定,也可以根据自己的需求来删除或添加词条。

这样以来,我们就可以把不同类型的数据区分开了。

从而避免了key的冲突问题。

例如我们的项目名称叫 project,有user和product两种不同类型的数据,我们可以这样定义key:

user相关key:project:user:1product相关的key:project:product:1

如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

KEY

VALUE

project:user:1

{"id":1, "name": "Jack", "age": 21}

project:product:1

{"id":1, "name": "小米11", "price": 4999}

并且,在Redis的桌面客户端中,还会以相同前缀作为层级结构,让数据看起来层次分明,关系清晰:

4. 操作String

set:添加一条String类型数据

get:获取一条String类型数据

mset:添加多条String类型数据

mget:获取多条String类型数据

5. 实例

String类型,也就是字符串类型,是Redis中最简单的存储类型。

其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  • string:普通字符串
  • int:整数类型,可以做自增.自减操作
  • float:浮点类型,可以做自增.自减操作

String的常见命令有:

  • SET:添加或者修改已经存在的一个String类型的键值对
  • GET:根据key获取String类型的value
  • MSET:批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的value
  • INCR:让一个整型的key自增1
  • INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
  • INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  • SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  • SETEX:添加一个String类型的键值对,并且指定有效期

贴心小提示:以上命令除了INCRBYFLOAT 都是常用命令

  • SET 和GET: 如果key不存在则是新增,如果存在则是修改
127.0.0.1:6379> set name Rose  //原来不存在
OK127.0.0.1:6379> get name 
"Rose"127.0.0.1:6379> set name Jack //原来存在,就是修改
OK127.0.0.1:6379> get name
"Jack"
  • MSET和MGET
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK127.0.0.1:6379> MGET name age k1 k2 k3
1) "Jack" //之前存在的name
2) "10"   //之前存在的age
3) "v1"
4) "v2"
5) "v3"
  • INCR和INCRBY和DECY
127.0.0.1:6379> get age 
"10"127.0.0.1:6379> incr age //增加1
(integer) 11127.0.0.1:6379> get age //获得age
"11"127.0.0.1:6379> incrby age 2 //一次增加2
(integer) 13 //返回目前的age的值127.0.0.1:6379> incrby age 2
(integer) 15127.0.0.1:6379> incrby age -1 //也可以增加负数,相当于减
(integer) 14127.0.0.1:6379> incrby age -2 //一次减少2个
(integer) 12127.0.0.1:6379> DECR age //相当于 incr 负数,减少正常用法
(integer) 11127.0.0.1:6379> get age 
"11"
  • SETNX
127.0.0.1:6379> help setnxSETNX key valuesummary: Set the value of a key, only if the key does not existsince: 1.0.0group: string127.0.0.1:6379> set name Jack  //设置名称
OK
127.0.0.1:6379> setnx name lisi //如果key不存在,则添加成功
(integer) 0
127.0.0.1:6379> get name //由于name已经存在,所以lisi的操作失败
"Jack"
127.0.0.1:6379> setnx name2 lisi //name2 不存在,所以操作成功
(integer) 1
127.0.0.1:6379> get name2 
"lisi"
  • SETEX
127.0.0.1:6379> setex name 10 jack
OK127.0.0.1:6379> ttl name
(integer) 8127.0.0.1:6379> ttl name
(integer) 7127.0.0.1:6379> ttl name
(integer) 5

二、Hash类型

1. 简介

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD

2. 常见命令

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value
  • HGET key field 获取存储在哈希表中指定字段的值
  • HDEL key field 删除存储在哈希表中的指定字段
  • HKEYS key 获取哈希表中所有字段
  • HVALS key 获取哈希表中所有值
  • HGETALL key 获取在哈希表中指定 key 的所有字段和值

3. 3操作hash

hset:添加一条hash类型数据

hget:获取一条hash类型数据

hmset:添加多条hash类型数据

hmget:获取多条hash类型数据

hgetAll:获取指定所有hash类型数据

hdel:删除指定hash类型数据(一条或多条)

4. 实例

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

Hash类型的常见命令

  • HSET key field value:添加或者修改hash类型key的field的值
  • HGET key field:获取一个hash类型key的field的值
  • HMSET:批量添加多个hash类型key的field的值
  • HMGET:批量获取多个hash类型key的field的值
  • HGETALL:获取一个hash类型的key中的所有的field和value
  • HKEYS:获取一个hash类型的key中的所有的field
  • HINCRBY:让一个hash类型key的字段值自增并指定步长
  • HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

贴心小提示:哈希结构也是我们以后实际开发中常用的命令哟

  • HSET和HGET
127.0.0.1:6379> HSET project:user:3 name Lucy//大key是 project:user:3 小key是name,小value是Lucy
(integer) 1
127.0.0.1:6379> HSET project:user:3 age 21// 如果操作不存在的数据,则是新增
(integer) 1
127.0.0.1:6379> HSET project:user:3 age 17 //如果操作存在的数据,则是修改
(integer) 0
127.0.0.1:6379> HGET project:user:3 name 
"Lucy"
127.0.0.1:6379> HGET project:user:3 age
"17"
  • HMSET和HMGET
127.0.0.1:6379> HMSET project:user:4 name HanMeiMei
OK
127.0.0.1:6379> HMSET project:user:4 name LiLei age 20 sex man
OK
127.0.0.1:6379> HMGET project:user:4 name age sex
1) "LiLei"
2) "20"
3) "man"
  • HGETALL
127.0.0.1:6379> HGETALL project:user:4
1) "name"
2) "LiLei"
3) "age"
4) "20"
5) "sex"
6) "man"
  • HKEYS和HVALS
127.0.0.1:6379> HKEYS project:user:4
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS project:user:4
1) "LiLei"
2) "20"
3) "man"
  • HINCRBY

127.0.0.1:6379> HINCRBY  project:user:4 age 2
(integer) 22
127.0.0.1:6379> HVALS project:user:4
1) "LiLei"
2) "22"
3) "man"
127.0.0.1:6379> HINCRBY  project:user:4 age -2
(integer) 20
  • HSETNX
127.0.0.1:6379> HSETNX project:user4 sex woman
(integer) 1
127.0.0.1:6379> HGETALL project:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
127.0.0.1:6379> HSETNX project:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL project:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
5) "sex"
6) "woman"

三、List类型

1. 简介

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。

既可以支持正向检索和也可以支持反向检索。

2. 特征

与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

3. 应用场景

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等

4. 常见命令

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部
  • LRANGE key start stop 获取列表指定范围内的元素
  • RPOP key 移除并获取列表最后一个元素
  • LLEN key 获取列表长度
  • BRPOP key1 [key2 ] timeout

移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

5. 操作list

lpush:左添加(头)list类型数据

rpush:右添加(尾)类型数据

lrange:获取list类型数据start起始下标 end结束下标 包含关系

llen:获取条数

lrem:删除列表中几个指定list类型数据

6. 实例

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。

既可以支持正向检索和也可以支持反向检索。

特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

List的常见命令有:

  • LPUSH key element ... :向列表左侧插入一个或多个元素
  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
  • RPUSH key element ... :向列表右侧插入一个或多个元素
  • RPOP key:移除并返回列表右侧的第一个元素
  • LRANGE key star end:返回一段角标范围内的所有元素
  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

  • LPUSH和RPUSH
127.0.0.1:6379> LPUSH users 1 2 3
(integer) 3
127.0.0.1:6379> RPUSH users 4 5 6
(integer) 6
  • LPOP和RPOP
127.0.0.1:6379> LPOP users
"3"
127.0.0.1:6379> RPOP users
"6"
  • LRANGE
127.0.0.1:6379> LRANGE users 1 2
1) "1"
2) "4"

四、Set类型

1. 简介

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。

2. 特征

具备与HashSet类似的特征

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

3. 常见命令

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

  • SADD key member1 [member2] 向集合添加一个或多个成员
  • SMEMBERS key 返回集合中的所有成员
  • SCARD key 获取集合的成员数
  • SINTER key1 [key2] 返回给定所有集合的交集
  • SUNION key1 [key2] 返回所有给定集合的并集
  • SDIFF key1 [key2] 返回给定所有集合的差集
  • SREM key member1 [member2] 移除集合中一个或多个成员

4. 操作set

sadd:添加set类型数据

smembers:获取set类型数据

scard:获取条数

srem:删除数据

5. 练习

1. 将下列数据用Redis的Set集合来存:

张三的好友有:李四、王五、赵六

李四的好友有:王五、麻子、二狗

2. 利用Set的命令实现下列功能

计算张三的好友有几人

计算张三和李四有哪些共同好友

查询哪些人是张三的好友却不是李四的好友

查询张三和李四的好友总共有哪些人

判断李四是否是张三的好友

判断张三是否是李四的好友

将李四从张三的好友列表中移除

6. 实例

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。

因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集.并集.差集等功能

Set类型的常见命令

  • SADD key member ... :向set中添加一个或多个元素
  • SREM key member ... : 移除set中的指定元素
  • SCARD key: 返回set中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set中
  • SMEMBERS:获取set中的所有元素
  • SINTER key1 key2 ... :求key1与key2的交集
  • SDIFF key1 key2 ... :求key1与key2的差集
  • SUNION key1 key2 ..:求key1和key2的并集

五、SortedSet类型

1. 简介

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。

SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,

底层的实现是一个跳表(SkipList)加 hash表。

2. 特征

  • 可排序
  • 元素不重复
  • 查询速度快

3. 应用场景

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

4. 常见命令

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员
  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
  • ZREM key member [member ...] 移除有序集合中的一个或多个成员

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

升序获取sorted set 中的指定元素的排名:ZRANK key member

降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

5. 操作sorted set

sorted set是通过分数值来进行排序的,分数值越大,越靠后。

zadd:添加sorted set类型数据

zrange:获取sorted set类型数据

zcard:获取条数

zrem:删除数据

zadd需要将Float或者Double类型分数值参数,放置在值参数之前

6. 练习题

将班级的下列学生得分存入Redis的SortedSet中

Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76

并实现下列功能

删除Tom同学

获取Amy同学的分数

获取Rose同学的排名

查询80分以下有几个学生

给Amy同学加2分

查出成绩前3名的同学

查出成绩80分以下的所有同学

7. 实例

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。

SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表

(SkipList)加 hash表。

SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet的常见命令有:

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
  • ZREM key member:删除sorted set中的一个指定元素
  • ZSCORE key member : 获取sorted set中的指定元素的score值
  • ZRANK key member:获取sorted set 中的指定元素的排名
  • ZCARD key:获取sorted set中的元素个数
  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
  • ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
  • ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
  • ZDIFF.ZINTER.ZUNION:求差集.交集.并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

  • 升序获取sorted set 中的指定元素的排名:ZRANK key member
  • 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

六、通用命令

1. 简介

通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key
  • EXISTS key 检查给定 key 是否存在
  • TYPE key 返回 key 所储存的值的类型
  • TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
  • DEL key 该命令用于在 key 存在时删除 key

通过help [command]可以查看一个命令的具体用法

例如:

# 查看keys命令的帮助信息:
127.0.0.1:6379> help keysKEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic

Redis中以层级关系、目录形式存储数据

2. 设置key的失效时间

Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) :

  • EXPlRE :用于将键 key 的生存时间设置为 ttl 秒。
  • PEXPIRE :用于将键 key 的生存时间设置为 ttl 毫秒。
  • EXPIREAT < timestamp>:用于将键 key 的过期时间设置为 timestamp 所指定的秒数时间戳。
  • PEXPIREAT < timestamp >:用于将键 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳。

方法一:

方法二:

方法三:

  • 第一个参数: key
  • 第二个参数: value
  • 第三个参数: NX 是不存在时才set, XX 是存在时才set
  • 第四个参数: EX 是秒, PX 是毫秒

3. 删除

del:用于删除数据(通用,适用于所有数据类型)

hdel:用于删除hash类型数据

tips命令为java中方法名,参数:去除括号,引号,将逗号变空格即可

zadd需要将Float或者Double类型参数,放置在值参数之前

4. 实例

通用指令是部分数据类型的,都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有key
  • DEL:删除一个指定的key
  • EXISTS:判断key是否存在
  • EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
  • TTL:查看一个KEY的剩余有效期

通过help [command] 可以查看一个命令的具体用法,例如:

代码如下

  • KEYS
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379># 查询以a开头的key
127.0.0.1:6379> keys a*
1) "age"
127.0.0.1:6379>

贴心小提示:在生产环境下,不推荐使用keys 命令,因为这个命令在key过多的情况下,效率不高

  • DEL
127.0.0.1:6379> help delDEL key [key ...]summary: Delete a keysince: 1.0.0group: generic127.0.0.1:6379> del name #删除单个
(integer) 1  #成功删除1个127.0.0.1:6379> keys *
1) "age"127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 #批量添加数据
OK127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "age"127.0.0.1:6379> del k1 k2 k3 k4
(integer) 3   #此处返回的是成功删除的key,由于redis中只有k1,k2,k3 所以只成功删除3个,最终返回
127.0.0.1:6379>127.0.0.1:6379> keys * #再查询全部的key
1) "age"	#只剩下一个了
127.0.0.1:6379>

贴心小提示:同学们在拷贝代码的时候,只需要拷贝对应的命令哦~

  • EXISTS
127.0.0.1:6379> help EXISTSEXISTS key [key ...]summary: Determine if a key existssince: 1.0.0group: generic127.0.0.1:6379> exists age
(integer) 1127.0.0.1:6379> exists name
(integer) 0
  • EXPIRE

贴心小提示:内存非常宝贵,对于一些数据,我们应当给他一些过期时间,当过期时间到了之后,他就会自动被

删除~

127.0.0.1:6379> expire age 10
(integer) 1127.0.0.1:6379> ttl age
(integer) 8127.0.0.1:6379> ttl age
(integer) 6127.0.0.1:6379> ttl age
(integer) -2127.0.0.1:6379> ttl age
(integer) -2  #当这个key过期了,那么此时查询出来就是-2 127.0.0.1:6379> keys *
(empty list or set)127.0.0.1:6379> set age 10 #如果没有设置过期时间
OK127.0.0.1:6379> ttl age
(integer) -1  # ttl的返回值就是-1

七、Key的层级结构

1. 简介

Redis没有类似MySQL中的Table的概念,我们该如何区分不同类型的key呢?

例如,需要存储用户.商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,

那就会冲突了,该怎么办?

我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:

Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:

这个格式并非固定,也可以根据自己的需求来删除或添加词条。

例如我们的项目名称叫 project,有user和product两种不同类型的数据,我们可以这样定义key:

  • user相关的key:project:user:1
  • product相关的key:project:product:1

如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

KEY

VALUE

project:user:1

{"id":1, "name": "Jack", "age": 21}

project:product:1

{"id":1, "name": "小米11", "price": 4999}

一旦我们向redis采用这样的方式存储,那么在可视化界面中,redis会以层级结构来进行存储,形成类似于这样的

结构,更加方便Redis获取数据

2. 常见命令

127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> smembers s1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem s1 a
(integer) 1127.0.0.1:6379> SISMEMBER s1 a
(integer) 0127.0.0.1:6379> SISMEMBER s1 b
(integer) 1127.0.0.1:6379> SCARD s1
(integer) 2

3. 案例

  • 将下列数据用Redis的Set集合来存储:
  • 张三的好友有:李四.王五.赵六
  • 李四的好友有:王五.麻子.二狗
  • 利用Set的命令实现下列功能:
  • 计算张三的好友有几人
  • 计算张三和李四有哪些共同好友
  • 查询哪些人是张三的好友却不是李四的好友
  • 查询张三和李四的好友总共有哪些人
  • 判断李四是否是张三的好友
  • 判断张三是否是李四的好友
  • 将李四从张三的好友列表中移除
127.0.0.1:6379> SADD zs lisi wangwu zhaoliu
(integer) 3127.0.0.1:6379> SADD ls wangwu mazi ergou
(integer) 3127.0.0.1:6379> SCARD zs
(integer) 3127.0.0.1:6379> SINTER zs ls
1) "wangwu"127.0.0.1:6379> SDIFF zs ls
1) "zhaoliu"
2) "lisi"127.0.0.1:6379> SUNION zs ls
1) "wangwu"
2) "zhaoliu"
3) "lisi"
4) "mazi"
5) "ergou"127.0.0.1:6379> SISMEMBER zs lisi
(integer) 1127.0.0.1:6379> SISMEMBER ls zhangsan
(integer) 0127.0.0.1:6379> SREM zs lisi
(integer) 1127.0.0.1:6379> SMEMBERS zs
1) "zhaoliu"
2) "wangwu"

八、总结

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

解释说明:

  • 字符串(string):普通字符串,常用
  • 哈希(hash):适合存储对象
  • 列表(list):按照插入顺序排序,可以有重复元素
  • 集合(set):无序集合,没有重复元素
  • 有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

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

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

相关文章

嘻哈纸片人仿手绘插画!FLUX一键生成方法!

​ ​ ​ 如何生成这种嘻哈纸片人的仿手绘插画&#xff1f; 只需1个lora&#xff0c;3个步骤&#xff01; 接下来我们来具体的说一下操作方法以及lora使用注意 嘻哈纸片人lora 基于FLUX模型训练 在线使用&下载地址&#xff1a; https://www.liblib.art/modelinfo/53ee…

计算机毕业设计之:微信小程序的校园闲置物品交易平台(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

使用 Paramiko 实现 SSH 远程连接和命令执行

使用 Paramiko 实现 SSH 远程连接和命令执行 每当灶火燃起&#xff0c;香气弥漫&#xff0c;熟悉的味道植入记忆深处&#xff0c;家&#xff0c;才获得完整的意义。万户千家&#xff0c;味道迥异&#xff0c;但幸福的滋味&#xff0c;却何其相同。 ——《风味人间》 在现代网络…

Kubernetes从零到精通(15-安全)

目录 一、Kubernetes API访问控制 1.传输安全(Transport Security) 2.认证(Authentication) 2.1 认证方式 2.2 ServiceAccount和普通用户的区别 2.3 ServiceAccount管理方式 自动ServiceAccount示例 手动ServiceAccount示例 3.鉴权 (Authorization) 3.1鉴权方式 3.2 …

TOF系列—深度图滤波

本篇文章主要介绍TOF深度图的后处理&#xff0c;鉴于自身水平所限&#xff0c;如有错误&#xff0c;欢迎批评指正。&#xff08;欢迎进Q群交流&#xff1a;874653199&#xff09; TOF由于其本身的特性&#xff0c;导致其所获得的深度图存在以下问题&#xff1a; 1.对空的地方存…

Kafka学习笔记(一)Kafka基准测试、幂等性和事务、Java编程操作Kafka

文章目录 前言4 Kafka基准测试4.1 基于1个分区1个副本的基准测试4.2 基于3个分区1个副本的基准测试4.3 基于1个分区3个副本的基准测试5 Java编程操作Kafka5.1 引入依赖5.2 向Kafka发送消息5.3 从Kafka消费消息5.4 异步使用带有回调函数的生产消息6 幂等性6.1 幂等性介绍6.2 Kaf…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(一)-概述

简介 此前的专栏介绍onesearch1.0和2.0&#xff0c;详情参看4 参考资料&#xff0c;本文解释onesearch 3.0&#xff0c;从Elasticsearch6升级到Elasticsearch8代码实现 &#xff0c;Elasticsearch8 废弃了high rest client&#xff0c;使用新的ElasticsearchClient&#xff0c;…

AI驱动的智能运维:行业案例与挑战解析

华为、蚂蚁、字节跳动如何引领智能运维&#xff1f; ©作者|潇潇 来源|神州问学 引言 OpenAI 发布的 ChatGPT 就像是打开了潘多拉的魔盒&#xff0c;释放出了生产环境中的大语言模型&#xff08;LLMs&#xff09;。一些新的概念&#xff1a;“大语言模型运维 (LLMOps)”…

统信服务器操作系统进入【单用户模式】

统信服务器操作系统D版、E版、A版进入单用户模式的方式。 文章目录 前言一、问题现象二、问题原因三、解决方案1. D版问题解决方案2. E版及A版问题解决方案前言 D版又称企业版、E版又称欧拉版、A版又称龙蜥版。 单用户模式主要是在 grub2 引导时编辑内核引导,一般用于修改用…

mysql索引结构操作(主键/唯一键/普通索引的创建/查询/删除),复合索引介绍(索引覆盖,索引最左匹配原则)

目录 索引操作 创建索引 主键索引 介绍 在创建表时设置主键 创建表后添加主键 唯一键索引 介绍 在创建表时设置唯一键 创建表后添加唯一键 普通索引 在创建表时指定某列为索引 创建表后添加普通索引 自主命名索引 索引创建原则 哪些列适合创建索引 不适合作为…

【Linux:共享内存】

共享内存的概念&#xff1a; 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中共享内存是由需要通信的双方进程之一来创建但该资源并不属于创建它的进程&#xff0c;而属于操作系统 共享内存可以在系统中存在多份&#xff0c;供不同个数&#xff0c;不同进…

14 vue3之内置组件trastion全系列

前置知识 Vue 提供了 transition 的封装组件&#xff0c;在下列情形中&#xff0c;可以给任何元素和组件添加进入/离开过渡: 条件渲染 (使用 v-if)条件展示 (使用 v-show)动态组件组件根节点 自定义 transition 过度效果&#xff0c;你需要对transition组件的name属性自定义。…

基于BeagleBone Black的网页LED控制功能(flask+gpiod)

目录 项目介绍硬件介绍项目设计开发环境功能实现控制LED外设构建Webserver 功能展示项目总结 &#x1f449; 【Funpack3-5】基于BeagleBone Black的网页LED控制功能 &#x1f449; Github: EmbeddedCamerata/BBB_led_flask_web_control 项目介绍 基于 BeagleBoard Black 开发板…

ChatGPT 推出“Auto”自动模式:智能匹配你的需求

OpenAI 最近为 ChatGPT 带来了一项新功能——“Auto”自动模式&#xff0c;这一更新让所有用户无论使用哪种设备都能享受到更加个性化的体验。简单来说&#xff0c;当你选择 Auto 模式后&#xff0c;ChatGPT 会根据你输入的提示词复杂程度&#xff0c;自动为你挑选最适合的AI模…

DataGrip远程连接Hive

学会用datagrip远程操作hive 连接前提条件&#xff1a; 注意&#xff1a;mysql是否是开启状态 启动hadoop集群 start-all.sh 1、启动hiveserver2服务 nohup hiveserver2 >> /usr/local/soft/hive-3.1.3/hiveserver2.log 2>&1 & 2、beeline连接 beelin…

缓存装饰器@cached_property

这个装饰器好像在好多包里都有&#xff0c;我在阅读源码的过程中&#xff0c;transformers.utils也有这个。查阅资料&#xff0c;大体上了解了它的用法。参考&#xff1a;[python]cached_property缓存装饰器 - faithfu - 博客园 这个装饰器用在类里面的某个方法前面&#xff0…

统信服务器操作系统【qcow2 镜像空间扩容】方案

使用 qcow2 镜像安装系统,当默认安装系统存储空间不够用时,进行自定义扩容 文章目录 准备环境扩容步骤一、检查环境信息1.查看镜像信息2.查看镜像分区信息3.确认需要扩容的分区名二、扩容1.备份镜像2.创建新的镜像文件,并指定空间3.将系统扩容到新的镜像三、扩容 lvm 分区四…

用5款AI帮你写论文,只需10分钟(附详细工具)

在当前的学术写作领域&#xff0c;AI技术的应用已经变得越来越普遍。借助这些工具&#xff0c;学生和研究人员可以显著提高写作效率&#xff0c;并在短时间内生成高质量的论文初稿。以下是五款值得推荐的AI论文写作工具&#xff0c;它们可以帮助你在10分钟内完成一篇论文&#…

【笔记】自动驾驶预测与决策规划_Part4_时空联合规划

文章目录 0. 前言1. 时空联合规划的基本概念1.1 时空分离方法1.2 时空联合方法 2.基于搜索的时空联合规划 &#xff08;Hybrid A* &#xff09;2.1 基于Hybrid A* 的时空联合规划建模2.2 构建三维时空联合地图2.3 基于Hybrid A*的时空节点扩展2.4 Hybrid A* &#xff1a;时空节…

Centos 7 搭建Samba

笔记&#xff1a; 环境&#xff1a;VMware Centos 7&#xff08;网络请选择桥接模式&#xff0c;不要用NAT&#xff09; 遇到一个问题就是yum 安装404&#xff0c;解决办法在下面&#xff08;没有遇到可以无视这句话&#xff09; # 安装Samba软件 yum -y install samba# 创建…