redis中list和hash的基本命令和使用场景

redis中list和hash的基本命令和使用场景,第1张

 Redis的数据类型

Redis的数据类型共有五种:string,list,hash,set,zset;

String 字符串相对来说做平常,key-value,类似是hashmap的用法;

List 队列,可以双向的存值,设计时,也可以简单用来当队列模式;

Hash 字典,一个key 对应多个值;

Set 无序的集合;

Zset 有序的集合;

列表 list

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

列表 list—— 基本命令

lpush

语法:lpush key value [value„]

作用:将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到表头

返回值:数字,新列表的长度

rpush

语法:rpush key value [value„]

作用:将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右 的顺序依次插入到表尾

返回值:数字,新列表的长度

lrange

语法:lrange key start stop

作用:获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,以 1 表示列表的第二个元素;

start ,

stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒 数第二个元素,以此类推。

start ,stop 超出列表的范围不会出现错误。

返回值:指定区间的列表

lindex

语法:lindex key index

作用:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。

0 表示列表的第一个元素,以 1 表示列表的第二个元素;

start ,

stop 是列表的下标值,也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

返回值:指定下标的元素;index 不在列表范围,返回nil

llen

语法:llen key

作用:获取列表 key 的长度 返回值:数值,列表的长度; key 不存在返回0

lrem

语法:lrem key count value

作用:根据参数count的值,移除列表中与参数value相等的元素,

count>0,从列表的左侧向右开始移 除;

count<0从列表的尾部开始移除;

count=0 移除表中所有与value相等的值。

返回值:数值,移除的元素个数

lset

语法:lset key index value

作用:将列表 key 下标为 index 的元素的值设置为 value。

返回值:设置成功返回 ok ; key 不存在或者 index 超出范围返回错误信息

linsert

语法:linsert key BEFORE(前)|AFTER(后) pivot value

作用:

将值value插入到列表key当中位于值pivot之前或之后的位置。

key不存在,pivot不在列表中, 不执行任何 *** 作。

返回值:命令执行成功,返回新列表的长度。没有找到 pivot 返回 -1, key 不存在返回 0。

RPOP key

移除列表的最后一个元素,返回值为移除的元素。

RPOPLPUSH source destination

移除列表的最后一个元素,并将该元素添加到另一个列表并返回

LPOP key

移除列表的第一个元素,返回值为移除的元素。

使用场景

1 消息队列

队列模式的情况下,可以使用,左进右出的原则,但不建议使用,因为现在市面上有很多成熟的消息中间件,没有必要造轮子;

2.排行榜

某一段时间统计数据的排行榜可以放在list里面,需要分页的话,也可以使用lrange start stop实现;

3 list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现

哈希类型hash

redis hash是一个 string 类型的 field 和 value 的映射表,hash特别适合用于存储对象,每个 hash 可以存储 232 - 1键值对(40多亿);

哈希类型 hash—— 基本命令

hset /hget /hmset /hmget /hgetall /hkeys /hvals /hexists

hset

语法:hset hash 表的key field value

作用:将哈希表 key 中的域 field 的值设为value ,如果 key 不存在,则新建 hash 表,执行赋值,如果有 field ,则覆盖值。

返回值: ①如果 field 是 hash 表中新field,且设置值成功,返回 1 ②如果 field 已经存在,旧值覆盖新值,返回0

hget

语法:hget key field

作用:获取哈希表 key 中给定域 field 的值

返回值:field 域的值,如果 key 不存在或者 field 不存在返回nil

hmset

语法:hmset key field value [field value„]

说明:同时将多个field-value(域-值)设置到哈希表key中,此命令会覆盖已经存在的field, hash表key不存在,创建空的hash表,执行hmset

返回值:设置成功返回ok, 如果失败返回一个错误

hmget

语法:hmget key field [field„]

作用:获取哈希表key中一个或多个给定域的值

返回值:返回和field顺序对应的值,如果field不存在,返回nil

hgetall

语法:hgetall key

作用:获取哈希表key中所有的域和值

返回值:以列表形式返回hash中域和域的值 ,key不存在,返回空hash

hdel

语法:hdel key field [field„]

作用:删除哈希表 key 中的一个或多个指定域 field,不存在 field 直接忽略

返回值:成功删除的 field 的数量

hkeys

语法:hkeys key

作用:查看哈希表 key 中的所有 field 域

返回值:包含所有 field 的列表,key 不存在返回空列表

hvals

语法:hvals key

作用:返回哈希表中所有域的值 返回值:包含哈希表所有域值的列表,key 不存在返回空列表

hexists

语法:hexists key field

作用:查看哈希表 key 中,给定域 field 是否存在

返回值:如果 field 存在,返回 1, 其他返回0

使用场景

1、购物车

以用户id为key,商品id为field,商品数量为value,恰好构成了购物车的3个要素,如下图所示。

2、hash还是比较适合存储对象(key field value)或者是字典表(type,key,vlaue),刚好符合对象的要素,但string + json也可以存储,两则比较有什么区别?

 String  + json    Hash

效率很  高           高

容量      低           低

灵活性  低           高

序列化  简单       复杂

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

一个列表最多可以包含超过 40亿个元素

列表的常用命令(持续扩充):

1、lpush key value1 [value2]: 将一个或多个值插入列表头部(左边)

通过执行lpush animal cat dog   向animal中左边同时插入 cat和dog,下方提示的(Integer)2,是指当前列表中元素的个数;

然后通过查询命令,我们可以看到排在第一个的是dog 第二个是cat,这是因为从左边插入,县插入cat,然后再在左侧插入dog,这就导致dog在cat的前面。

2、rpush key value1 [value2]: 将一个或多个值插入列表尾部(右边)

执行rpush animal monkey:向列表的右侧插入一个元素monkey,此时列表中的元素就有3个

通过查询命令我们可以看到monkey出现在了列表的尾部

3、lrange key start stop: 获取列表指定范围内的元素(包含start和stop)

执行lrange animal 1 2  查询列表的第2个和第3个元素(注意列表中的索引是从0开始计算的)

4、llen key: 获取列表长度

在前面几个步骤中我们一共插入了三个元素dog、cat、monkey

5、lpop key: 移出并获取列表的第一个元素

列表中第一个元素是dog,执行lpop animal后,d出左边第一个元素并返回,再次查询,我们看到只剩下两个元素

6、rpop key: 移出并获取列表的最后一个元素

执行rpop animal,移除并返回monkey,最后列表中只剩下cat一个元素

Get参数的长度一般位于URL中,关于Get参数列表的长度可以通过计算参数数量来获得。可以使用如下方法:

1 获取URL字符串中的所有“&”符号;

2 根据“&”符号的总数来计算出参数列表的长度(即参数个数)。

方法:

使用len函数获取列表的长度,用if函数判断这个列表的长度是否不为零,如果列表的长度不为零,就表示这个列表为非空列表

执行结果如下:

更多Python知识,请关注:Python自学网!!

Aspnet获取arrayList的长度,代码如下:

package comyjzdemo;

import javautilArrayList;

 public class Demo_3 {

/

  @param args

 /

public static void main(String[] args) {

// TODO 自动生成方法存根

ArrayList al = new ArrayList();

aladd("a");

aladd("b");

aladd("c");

Systemoutprintln("ArrayList 的大小为 : "+alsize());

for(int i=0; i<alsize(); i++){

Systemoutprintln(" : " + alget(i));

}

alremove(1);

for(int i=0; i<alsize(); i++){

Systemoutprintln(" : " + alget(i));

}

}

 }

至此,我们已经把python最基本的数据结构讲的差不多了

不了解这个你可能永远不会成为python大佬(3)

不了解这个你可能永远不会成为python大佬(4)

从这节开始,你就可以写一个完整的程序结构,而不是一些零碎的小片段啦!

这节我们开始讲:

if条件语句 | for循环 | while循环 | 跳出和终止循环

[赞][赞][赞][赞][赞][赞]

01

if条件语句

顾名思义,if是“如果”的意思,它常用来判断程序在什么情况下需要做什么事,python里的条件语句形如:

1 如果如果a成立,则执行b

if 条件a :

b

2 如果a成立,则执行b,否则(else)执行c

if 条件a :

b

else:

c

3如果a成立,则执行b,否则如果c成立,则执行d,如果都不成立,执行e

if 条件a :

b

elif 条件c :

d

else:

e

上文中的 仅代表4个空格缩进,如果是在notebook里写, 冒号":" 回车后会自动缩进(python程序结构的划分就是依据 严格的缩进 ,if、for等语句的缩进必须注意)

条件语句可以多种多样,像下面这样:

a= 3

b= 5

if a== 3 and b== 4 :

print( 'and用法' )

elif a== 3 or b== 4 :

print( 'or用法' )

else :

print( '比大小' )

a and b表示必须两个同时成立,a or b则只需要至少一个成立即可。

输出结果:

or 用法

小知识:短路效应

a and b中,a如果为 ,则python默认不执行b语句,由定义直接判定为

a or b中,a如果为 ,则默认不执行b语句,直接判定为 ,这就是著名的 短路效应

02

for、while循环

循环 是让一个语句 重复多次 ,为了提高程序效率。 for循环 形如:

for 变量 in 序列:

语句

可以依次循环列表中每个值,如:

for i in [ 'a' , 'b' , 'c' , 'd' ]:

print(i)

输出结果:

a b c d

上面的循环还可以写成另一种形式:

list_1=[ 'a' , 'b' , 'c' , 'd' ]

for i in range(len(list_1)):

print(list_1[i])

输出结果:

a b c d

第二种方法虽然看起来麻烦些,但实际工作中其实用的更多。

range()函数

上面程序里出现了 range() 函数,这里简单讲一下:

其中 len() 函数是 获取列表的长度 range() 函数是一个 生成序列数 的函数。基本形式为 range(x,y,l) range(10) 代表一个 0~9 的序列, range(0,10) range(10) 相同,默认步长为1,如下:

list_1=[x for x in range( 10 )] #0~9,省略起始数字,左闭右开

list_2=[x for x in range( 0 , 10 )] #0~9,起始数字为0,左闭右开

list_3=[x for x in range( 0 , 10 , 2 )] #0~9,步长为2取,左闭右开

print(list_1);print(list_2);print(list_3)

输出结果:

[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]

[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]

[ 0 , 2 , 4 , 6 , 8 ]

上面也是一种用 for循环生成列表 的快捷方式。

实际工作里,如果想在n个不同序列中同时循环n个量,可以像这样:

for i, n, c in zip([ 0 , 1 ], [ 'bad' , 'good' ], [ 'green' , 'red' ]):

print(i,n,c)

输出结果:

0 bad green

1 good red

其中, zip() 是一个 “打包”函数 ,将[0,1], ['bad','good'], ['green','red']变为

[(0,'bad','green'),(1,'good','red')],然后i、n、c分别进行循环。

( ps:我经常用这个方式绘图,可以一次性绘制多个参数,有奇效 )

while 意为当成立时执行,循环形如:

while 条件 :

语句

简单例子:

i= 0

while (i< 5 ) :

print(i)

i=i+ 1

上面程序就是让i每次循环中变化,直到不满足i<5时跳出循环。

for while 选择哪个一般来说都行, while 更侧重 明确有中断条件 的情况, for 更侧重于 有确定长度或是循环已知的列表 ,但也可以在结构里设置中断,总的来说, for的适用面更广泛

03

break与continue

余下的篇幅简单讲下循环中的中断标志符: break continue

break 很简单,遇到break 直接跳出当前循环 ,这个循环就废了,不再进行

continue 则是 跳过本轮的循环,后面循环继续

简单的例子展示一下区别:

list_1=[ 'a' , 'b' , 'c' , 'd' ]

for i in range(len(list_1)):

if (list_1[i]== 'c' ):

break

print(list_1[i])

输出结果:

a

b

换成continue:

for i in range(len(list_1)):

if (list_1[i]== 'c' ):

continue

print(list_1[i])

输出结果:

a

b

d

区别显而易见了。

这时候就很多人要问了,如果我想满足某个条件就 连续 跳出好几层循环,该咋办?如果直接用break,会出现下面这样:

for i in range( 10 ):

for j in range( 10 ):

if (j== 3 ):

break

print( 'j中断位置:' ,j)

print( 'i中断位置:' ,i)

输出结果:

j中断位置: 3

i中断位置: 9

显然break只能跳出内层循环,外部的循环仍然完整的进行了。

我们引入 break_flag标志位 来解决这个问题:

for i in range( 10 ):

break_flag = False #跳出整个循环的标志

for j in range( 10 ):

if (j== 3 ):

break_flag = True

break

if (break_flag):

break #跳出外层循环

print( 'j中断位置:' ,j)

print( 'i中断位置:' ,i)

输出结果:

j中断位置: 3

i中断位置: 0

这里,内层 break 前先将 break_flag 置为 True ,跳出内层后 if(break_flag ) 判定成立,再次执行外层的 break ,达到了连续跳多层循环的目的。

如果 Redis 中某个 key 对应的值是一个列表(list),您可以使用以下命令对其进行 *** 作:

1 LPUSH/ RPUSH: 向列表左侧或右侧添加元素。

命令格式:

LPUSH key value1 [value2 valuen]

RPUSH key value1 [value2 valuen]

如:LPUSH mylist "redis" "mongodb" "mysql"

2 LPOP/RPOP: 从列表左侧或右侧d出元素,相当于删除列表头部或尾部的元素,并返回该元素的值。

命令格式:

LPOP key

RPOP key

如:LPOP mylist

3 LINDEX: 获取列表中指定索引位置的元素。

命令格式:

LINDEX key index

如:LINDEX mylist 0

4 LRANGE: 获取列表中指定范围内的所有元素。

命令格式:

LRANGE key start stop

如:LRANGE mylist 0 2

5 LLEN: 获取列表的长度(即其中元素的个数)。

命令格式:

LLEN key

如:LLEN mylist

6 LREM: 从列表中删除指定数量的元素。可以通过给定的 count 参数来控制删除相同元素的个数。

命令格式:

LREM key count value

如:LREM mylist 2 "redis"

希望这些命令能够帮助您 *** 作 Redis 中的列表。

以上就是关于redis中list和hash的基本命令和使用场景全部的内容,包括:redis中list和hash的基本命令和使用场景、Redis数据结构--List(列表)、get参数list长度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9408457.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存