Redis的数据类型与CURD

Redis 的数据类型

String(字符串)

string 是 redis 里 最基本的 数据类型,一个 key 对应一个 value

string 类型是二进制安全的,除了普通的字符串外,也可以存放图片等数据

Redis 中字符串 value 最大值是 512M

例如:存放一个地址信息:

​ address 北京天安门

说明:

​ key: address

​ value: 北京天安门

set / get / del

set : 存在则修改,不存在则添加

get: 通过键名获取值

del: 通过键名删除指定的键值对

setex: 设置 键秒值

  • 语法: SETEX key seconds value
  • 功能:
    1. 将值 value 关联到 key,并将 key 的生存时间设为 seconds(以秒为单位)
    2. 如果 key 已经存在,SETEX 命令将覆写旧值
    3. 类似 于以下命令
SET key value
EXPIRE key seconds # 设置生存时间

操作演示:

setex message 10 hi

运行结果:

​ 使用 get 仍然可以获取 message 的值,但 10 秒后就显示为 nil 了

meset: 同时设置一个或多个键值对

​ 语法:MSET key value [key value…]

​ 备注:用中括号 ([]) 括起来的表示它是一个可选

​ 操作演示:

mset worker1 Jason worker2 Jhon worker3 Tom
get worker3
mget worker1 worker2

​ 运行结果:

"Tom"
1) "Jason"
2) "Jhon"

Hash(哈希)

  1. Hash 是一个键值对集合
  2. Hash 是一个 string 类型的 field 和 value 的映射表,Hash适用于存储对象

例如:存放一个 User 信息

​ user1 name 张三 age 18

说明:

​ name : 张三

​ age : 18

  1. 语法:

hset key field value

hget key field

操作演示:

hset user name Tom
hset user age 22
hget user age

​ 运行结果:

(integer) 1
(integer) 1
"22"

hgetall:

​ 语法:hgetall key

​ 功能:提取出 key 的所有字段值(仅限哈希结构)

hgetall user

​ 运行结果:

1) "name"
2) "Tom"
3) "age"
4) "22"

hdel:

​ 看名字就知道是删除了,它是用来删除 key 中的字段的

hdel user name
hgetall user

​ 运行结果:

(integer) 1
1) "age"
2) "22"

练习:使用HMSETHMGET一次行设置多个字段名或者获取多个字段名。

hmset user2 name jerry age 26 salary 20000
hmget user2 name salary

​ 运行结果:

1) "jerry"
2) "20000"

hlen:统计指定的 Key 中有多少个字段

hlen user2

运行结果:

(integer) 3

hexists:检测字段的存在性

hexists user2 name
hexists user2 company

运行结果:

(integer) 1
(integer) 0

List(列表)

  1. 简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)
  2. List本质上是个链表,List 的 元素是有序的元素的值可以重复

例如:存放多个地址信息

​ city Beijing Shanghai Tianjin

说明:

​ key : city

​ 北京,天津,上海 就是三个元素

  1. 语法

lpush key value [value ...]

lrange key start stop

说明:

​ start : 起始坐标,第一个位置是 0

​ end : 结束坐标,最后一个位置是 -1

操作演示:

lpush city beijing shanghai tianjin
lrange city 0 -1

运行结果:

1) "tianjin"
2) "shanghai"
3) "beijing"

似乎有点奇怪?好像和我们输入的顺序是相反的。其实 List 像是一个队列(管道),lpush 是在这个管道的左边放入元素的,随着元素的增加,先放入的元素就渐渐滑到管道的右边(本质是对链表的头插操作),而 lrange 是从管道的左边去取元素,自然最后一个被放入的元素被最先取出。

lpushlrange 中的 l指的是 left

那既然有 Left,会不会有 Right 呢?它确实是有的,和你想的一样,它叫rpush, 那有没有 rrange 这种操作呢,很可惜,是没有的。

rpush city guangdong
lrange city 0 -1

来仔细想想运行结果,最开始我们在 city 里从左边依次放入了 北京,上海,天津 三个元素,此时自左向右分别是 天津,上海,北京,然后再在右边插入了元素 广东,那么广东就应该在北京右边。

运行结果:

1) "tianjin"
2) "shanghai"
3) "beijing"
4) "guangdong"

lpop: left pop,顾名思义,就是从左边 pop 一个元素,pop 就是弹出,也就是从队列里拿出来,而 range 只是一种偷看

lpop city
lrange city 0 -1

运行结果:

"tianjin"

1) "shanghai"
2) "beijing"
3) "guangdong"

可以看到,结果如预期一样,city 里面少了一个元素

rpop:现在不用说也知道这是干什么的了吧,right pop, 从右边弹出一个元素,大家可自行去尝试一下

del:delete,直接把 key 干掉就可以删掉整个 list 了

Set(集合)

  1. Redis 中 set 是string类型的无序集合
  2. 底层是HashTable数据结构,Set 也是存放很多字符串的元素,字符串元素是无序的,而且元素的值不能重复

例如:存放多个邮件列表信息

​ email orange@163.com timelight@qq.com

说明:

​ key : email

​ orange@163.com timelight@qq.com 就是两个元素

  1. 语法

sadd key member [member ...]

smembers key

操作演示:

sadd emails orange@163.com timelight@qq.com
sadd emails xunanmu@163.com fuli@qq.com
smembers emails
sadd emails xunanmu@163.com  # 尝试重复添加

运行结果:

(integer) 2
(integer) 2
1) "orange@163.com"
2) "fuli@qq.com"
3) "xunanmu@163.com"
4) "timelight@qq.com"
(integer) 0  # 没有加进去

sismember: 判断值是否是成员

srem : 删除指定值

sismember emails orange@163.com
srem emails orange@163.com
sismember emails orange@163.com

运行结果:

(integer) 1
(integer) 1
(integer) 0