Redis-02.哈希与列表基本类型

Redis-02.哈希与列表基本类型

一、哈希类型

​ 在Redis中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1,value1},...{fieldN,valueN}}。

1、命令

在下面的命理中,user:1只是一个字符串而已,一个键。

#设置值
hset key field value
	#为user:1添加一对field-value
	hset user:1 name tom
#获取值
hget key field
	#获取user:1的name域(属性)对应的值
	hget user:1 name
#删除field
hdel key field [field ...]
	#hdel会删除一个或者多个field,返回结果为常规删除field的个数
	hdel user:1 name
#计算field个数
hlen key
#批量设置或者获取fielld-value
hmget key field [field ...]
hmset key field value [field value ...]
	#例如:
	hmset user:1 name mike age 12 city tianjin
	hmget user:1 name city
#判断field是否存在
hexists key field
	#例如,user:1包含name域,所以返回结果1,不包含时返回0:
	hexists user:1 name
#获取所有的field,它返回制定哈西键所有的field
	hkeys key
	#例如:
	hkeys user:1
#获取所有value
	hvals key
	#下面操作获取user:1全部value
	hvals user:1
#获取所有的field-value
	hgetall key
	#下面操作获取user:1所有的field-value
#hincrby hincrbyfloat
hincrby key field
hincrbyfloat key field
	#hincrby和hincrbyfloat,就先incrby和incrbyfloat命令一样,但是它们的作用域是field
#计算value的字符串长度
hstrlen key field
	#例如hget user:1 name的value时tom。那么hstrlen的返回结果是3
	hstrlen user:1 name

2、内部编码

image-20211026175603071

演示

image-20211026175801699

  • 另外:当field个数超过512个,内部编码也会由ziplist变为hashtable

3、使用场景

①关系型数据库表的映射

image-20211026180327156

②做缓存

image-20211026180432598

二、列表类型

1、列表的特点

​ 列表类型(list)是用来存储多个有序的字符串。列表中的每个字符串称为元素(element),一个列表最多可以存储2^32-1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。因此,它可以充当栈和队列的角色。

image-20211108172347664

  • 列表重元素有序
  • 可以通过索引下标获取某个元素或者某个范围内的元素列表

2、命令

  • 列表的操作类型

image-20211108172620809

添加

#从右边插入元素
rpush key value [value ...]
	#从右向左插入元素c、b、a
	rpush listkey c b a
	#lrang0-l命令可以从左到右获取列表的所有元素
	lrange listkey 0 -1

image-20211108173024892

#从左边插入元素
lpush key value [value...]
#向某个元素前或者后插入元素
linsert key before|after pivot value
	#linsert会从列表中找到等于pivot的元素,在其前或者后插入一个新的元素
	linsert list key before b java
	

image-20211108173310384

查找

#获取指定范围内的元素列表
lrange key start end
#第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。
#第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同,例如想获取列表的第2到第4个元素,可以执行如下操作:
lrange listkey 1 3

#获取列表指定索引下标的元素
lindex key index
	#获取当前列表最后一个元素
	lindex listkey -1
#获取列表长度
llen key

删除

#从列表左侧弹出元素
lpop key
#从列表右侧弹出
rpop key 
#删除指定元素
lrem key count value
#lrem命令会从列表中找到等于value的元素进行删除,根据count的不同
#分为三种情况:
#·count>0,从左到右,删除最多count个元素。
#·count<0,从右到左,删除最多count绝对值个元素。
#·count=0,删除所有。

#按照索引范围修剪列表
ltrim key start end
	#下面的操作只会保留列表listkey第2到4个元素
	ltrim listkey 1 3

修改

#修改指定索引下标的元素
lset key index newValue
	#将列表listkey中的第3个元素设置为python:
	lset listkey 2 python

阻塞操作

#阻塞式弹出:
blpop key [key ...] timeout
brpop key [key ...] timeout

#blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用
#方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:
·key[key...]:多个列表的键。
·timeout:阻塞时间(单位:秒)。

image-20211108174211388

image-20211108174250057

image-20211108174855258

image-20211108174914570

  • 第二点,如果多个客户端对同一个键执行brpop,那么最先执行brpop命 令的客户端可以获取到弹出的值。然后其他执行brpop的客户端会继续阻塞。

3、内部编码

image-20211108175207333

4、使用场景

①消息队列

image-20211108175451962

  • Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令 阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用 性。

②其他场景

image-20211108175748932

posted @ 2021-11-08 18:00  DarkerG  阅读(55)  评论(0)    收藏  举报