Redis的五大数据结构(1)——String、List

本文介绍了Redis中的两种基本数据结构——String和List。String类型支持多种操作,如append、GETRANGE、setex和setnx等,常用于计数器、统计和对象缓存。List则能实现栈和队列功能,通过LPOP、RPOP、lset等命令进行操作,适用于构建消息队列或栈。
摘要由CSDN通过智能技术生成

Redis的五大数据结构

  • String
  • List
  • Set
  • Hash
  • Zset

1.String字符串类型

在这里插入图片描述

append key “…” ,当key不存在时,相当于会set一个key出来

在这里插入图片描述

步长 i+=
127.0.0.1:6379> set views 0   #  初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views   #自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views   #自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incrBy views 10   #可以设置步长,指定增量
(integer) 10
127.0.0.1:6379> incrby views 10
(integer) 20
127.0.0.1:6379> decrby views 5   #设置步长,指定减量
(integer) 15
127.0.0.1:6379> decrby views 10
(integer) 5

字符串范围 GETRANGE


127.0.0.1:6379> set key1 "hello,redis"    #设置key1的值
OK
127.0.0.1:6379> get key1
"hello,redis"
127.0.0.1:6379> getrange key1 0 3   #截取字符串  [0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1   #获取全部的字符串,相当于get key
"hello,redis"
####################################################

#替换   使用setrange 
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 qq  #从key2中替换从索引为1处开始两位替换成qq
(integer) 7
127.0.0.1:6379> get key2
"aqqdefg"

setex (set with expire) //设置过期时间
setnx (set if not exist) //不存在时设置

127.0.0.1:6379> setex key3 30 "hello"   #设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key1"
3) "key2"
127.0.0.1:6379> ttl key3     #显示剩余过期时间
(integer) 16
127.0.0.1:6379> setnx mykey "redis"   #如果mykey不存在就创建key
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "mykey"
3) "key2"
127.0.0.1:6379> setnx mykey "MongoDB"  #如果mykey存在就创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"

设置多个k-v

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3   #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4  #msetnx:当不存在时创建,是一个原子性操作,要么同时成功,要么同时失败。
(integer) 0

设置对象

#Redis通过这个设计可以实现对对象的存储。
#如下的语句的意思为:设置user的第一个对象的名称为zhangsan,年龄12 ,mset同时设置多值。
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 12 
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "12"

getset命令:先get再set

127.0.0.1:6379> getset db redis  #get不到db会创建一个db,value为redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db MongoDB  #如果存在值,返回原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"MongoDB"

String类型的使用场景 :value值不经可以是字符串还可以是数字。

  • 计数器
  • 统计数量
  • 对象缓存存储

2.List列表类型

再Redis里面我们可以讲list做成栈,队列,阻塞队列。
所有的list命令送都是以"l"开头

127.0.0.1:6379> lpush list one   #将一个值多多个值插入到列表的头部(左)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3 
127.0.0.1:6379> lrange list 0 1  #通过区间来获取到具体的值
1) "three"
2) "two"
127.0.0.1:6379> lrange list 0 -1   #获取list中的值
1) "three"
2) "two"
3) "one"

127.0.0.1:6379> rpush list right   #从列表的右边插入一个或多个值
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"

LPOP
RPOP

127.0.0.1:6379> lrange list 0 -1   #获取列表中的所有值
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> rpop list   #移除列表中第一个元素
"right"
127.0.0.1:6379> lpop list   # 移除列表中最后一个元素
"three"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
######################################################
127.0.0.1:6379> lindex list 0   根据下标来获取值
"two"
127.0.0.1:6379> lindex list 1
"one"

127.0.0.1:6379> llen list   #获取list长度
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"

移除指定value

127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one  #移除list中指定个数的value,精确匹配。
(integer) 1 
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three   #移除list中2个值为three的value值
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"


trim:修剪

127.0.0.1:6379> lpush mylist "hello"
(integer) 1
127.0.0.1:6379> lpush mylist "hello1"
(integer) 2
127.0.0.1:6379> lpush mylist "hello2"
(integer) 3
127.0.0.1:6379> lpush mylist "hello3"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379> ltrim mylist 1 2   #根据下标及截取内容,内容被修改
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
2) "hello1"

rpoplpush :删除列表的最后一个元素并移动到新的列表中

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello12"
(integer) 3
127.0.0.1:6379> rpoplpush mylist newlist  #删除mylist的最后一个元素并添加到newlist中
"hello12"
127.0.0.1:6379> lrange newlist 0 -1  #查看目标列表中元素
1) "hello12"

lset list 0 value : 将下标元素的值替换成另外一个值。如果元素不存在会报错。

127.0.0.1:6379> lpush list yuansu
(integer) 1
127.0.0.1:6379> lset list 0 item   #设置list中第一个元素为item
OK
127.0.0.1:6379> lrange list 0 -1  #获取处list中的value,修改成功
1) "item"
127.0.0.1:6379> lset list 1 new
(error) ERR index out of range

linsert 在指定value之前或之后插入

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> LINSERT mylist after world redis  #在world之后插入 redis
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
3) "redis"
127.0.0.1:6379> linsert mylist after hello new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "new"
3) "world"
4) "redis"
127.0.0.1:6379> linsert mylist before new year  #在元素new之前插入year
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "year"
3) "new"
4) "world"
5) "redis"


总结

List是一个链表,在两边插入或改动数据时效率比较高,对于中元素来说效率就比较慢。当使用lpush,rpop时可以作为消息队列,当使用lpush,lpop时作为栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值