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长度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)