Redis 笔记(2)String、List -数据类型

本文深入解析Redis中的五种主要数据类型:String、List、Set、Sorted Sets和Hash,重点介绍了每种类型的特性和常用操作,如set、get、lpush、lrange等,以及它们在实际场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Redis数据就是以key-­value形式来存储的,key只能是字符串类型,value可以是以下五种类型:String、List、 Set、Sorted­Sets、Hash

String类型

1.简介:
字符串类型是Redis中为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任 何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value多可以容纳的数据长度 是512M

2.操作

  • set
  • get
  • append
  • strlen
$ redis-cli
127.0.0.1:6379> select 0                          #切换到第一个数据库,默认共有16个数据库
索引从0开始
OK
127.0.0.1:6379> keys *                              #显示所有的key
(empty list or set)
127.0.0.1:6379> set name tom          #设置键
OK
127.0.0.1:6379> get name                #获取键对应的值
"tom"
127.0.0.1:6379> exists mykey              #判断该键是否存在,存在返回1,不存在返回0
0
(integer) 0
127.0.0.1:6379> append mykey "hello"    #如果该键不存在,则创建,返回当前value的长度
(integer) 5
127.0.0.1:6379> append mykey "world"  #如果该键已存在,则追加,返回追加后的value长度
(integer) 11
127.0.0.1:6379> get mykey   #获取mykey的值
"hello world"
127.0.0.1:6379> strlen mykey   #获取mykey的长度
(integer) 11
#EX和PX表示失效时间,单位为秒和毫秒,两者不能同事使用:NX表示数据库中不存在时才能设置,XX表示存在时才能设置
127.0.0.1:6379> set mykey "this is test" EX 5 NX
OK
127.0.0.1:6379>  get mykey
"this is test"

注:命令不区分大小写,但key和value区分大小写

  • incr
  • decr
  • incrby
  • decrby
127.0.0.1:6379> flushdb     #清空数据库
OK
127.0.0.1:6379> set mykey 20
OK
127.0.0.1:6379> incr mykey       #递增1
(integer) 21
127.0.0.1:6379> decr mykey      #递减1
(integer) 20
127.0.0.1:6379> del mykey     #删除该键
(integer) 1
127.0.0.1:6379> decr mykey 
(integer) -1
127.0.0.1:6379> del mykey
(integer) 1
127.0.0.1:6379> INCR mykey
(integer) 1
127.0.0.1:6379> set mykey 'hello'    #将该键的value设置为不能转化为整型的普通字符串
OK
127.0.0.1:6379> incr mykey     #在该键上再次执行递增操作时,Redis将报告错误信息
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set mykey 10
OK
127.0.0.1:6379>  incrby mykey 5     #递增5 ,即步长
(integer) 15
127.0.0.1:6379> decrby mykey 10    #递减10
(integer) 5
  • getset
  • setex
  • setnx
# getset  获取的时候并设置新的值
127.0.0.1:6379> incr mycount         #将计数器的值原子性的递增1
(integert 1
127.0.0.1:6379> getset mycount 666   #在获取计数器原有的值的同时,并将其设置为新值
"1"
127.0.0.1:6379> get mycount
"666"

#  setex 设置过期时间
127.0.0.1:6379> setex mykey 10 "hello"   #设置指定key的过期时间为10秒,等同于set mykey hello ex 10
OK
127.0.0.1:6379>  ttl mykey   #查看指定key的过期时间(秒数)
(integer) 8

#  setnx  当key不存在时才能设置
127.0.0.1:6379> del mykey
(integer) 0
127.0.0.1:6379> setnx mykey "aaa"  #key不存在,可以设置,等同于set mykey aaa nx
(integer) 1
127.0.0.1:6379> setnx mykey  "bbb"   #key存在,不能设置
(integer) 0
127.0.0.1:6379> get mykey
"aaa"
  • setrange 设置
  • getrange 获取指定索引位置的字符
127.0.0.1:6379> set mykey "hello world"
OK
127.0.0.1:6379>  get mykey
"hello world"
127.0.0.1:6379> setrange mykey 6 dd  #从索引为6的位置开始替换(索引从0开始)
(integer) 11
127.0.0.1:6379> get mykey
"hello ddrld"
127.0.0.1:6379> setrange mykey 20 dd   #超过的长度使用0代替
(integer) 22
127.0.0.1:6379> get mykey
"hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd"
127.0.0.1:6379> getrange mykey 3 12   #获取索引为【3,12】之间的内容
"lo ddrld\x00\x00"
  • setbit 设置
  • getbit 获取指定位的BIT值,应用场景:考勤打卡
127.0.0.1:6379> del mykey
(integer) 1
127.0.0.1:6379> setbit mykey 7 1  #设置从0开始计算的第七位BIT值为1,返回原有BIT值0
(integer) 0
127.0.0.1:6379> get mykey    #获取设置的结果,二进制的0000 0001的十六进制为0x01
"\x01"
127.0.0.1:6379> setbit mykey 6 1        #设置从0开始计算的第六位BIT值为1,返回 原有BIT值0       (integer) 0 
127.0.0.1:6379> get mykey                 #获取设置的结果,二进制的0000 0011的十 六进制值为0x03     
"\x03" 
127.0.0.1:6379> getbit mykey 6           #返回了指定Offset的BIT值      
(integer) 1 
127.0.0.1:6379> getbit mykey 10         #如果offset已经超出了value的长度,则返 回0       
(integer) 0
  • mset
  • mget
  • msetnx
127.0.0.1:6379> mset key1 "hello" key2 "world"  #批量设置了key1和key2两个键。   
OK 
127.0.0.1:6379> mget key1 key2              #批量获取了key1和key2两个键的值。       
1) "hello" 
2) "world" 
#批量设置了key3和key4两个键,因为之前他们并不存在,所以该命令执行成功并返回1 127.0.0.1:6379> msetnx key3 "itany" key4 "liu"  (
integer) 1 
127.0.0.1:6379> mget key3 key4                    
1) "itany" 
2) "liu" 
#批量设置了key3和key5两个键,但是key3已经存在,所以该命令执行失败并返回0 127.0.0.1:6379> msetnx key3 "hello" key5 "world"  
(integer) 0
 #批量获取key3和key5,由于key5没有设置成功,所以返回nil 
 127.0.0.1:6379> mget key3 key5                    
 1) "itany" 
 2) (nil)

List类型

在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部 (left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如 果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的大元素数量是 4294967295。 从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即 使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作 是作用于链表中间,那将会是非常低效的。

  • lpush
  • lpushx
  • lrange
127.0.0.1:6379> flushdb 
OK 
#创建键mykey及与其关联的List,然后将参数中的values从左到右依次插入 
127.0.0.1:6379> lpush mykey a b c d 
(integer) 4 
#获取从位置0开始到位置2结束的3个元素 
127.0.0.1:6379> lrange mykey 0 2 
1) "d" 
2) "c" 
3) "b" 
#获取链表中的全部元素,其中0表示第一个元素,­-1表示后一个元素 
127.0.0.1:6379> lrange mykey 0 ­-1 
1) "d" 
2) "c" 
3) "b" 
4) "a" 
#获取从倒数第3个到倒数第2个的元素 
127.0.0.1:6379> lrange mykey ­-3 -­2 
1) "c" 
2) "b" 
#lpushx表示键存在时才能插入,mykey2键此时并不存在,因此该命令将不会进行任何操作,其返回值 为0 
127.0.0.1:6379> lpushx mykey2 e      
(integer) 0 
#可以看到mykey2没有关联任何List Value 
127.0.0.1:6379> lrange mykey2 0 -­1 
(empty list or set)
 #mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量 
 127.0.0.1:6379> lpushx mykey e 
 (integer) 5 
 #获取该键的List中的第一个元素 
 127.0.0.1:6379> lrange mykey 0 0 
 1) "e"
  • lpop
  • llen
127.0.0.1:6379> flushdb 
OK 
127.0.0.1:6379> lpush mykey a b c d 
(integer) 4 
#取出链表头部的元素,该元素在链表中就已经不存在了 
127.0.0.1:6379> lpop mykey 
"d" 
127.0.0.1:6379> lpop mykey 
"c" 
#在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是2 
127.0.0.1:6379> llen mykey 
(integer) 2
  • lrem
  • lindex
  • lset
  • ltrim
127.0.0.1:6379> flushdb 
OK 
#准备测试数据 
127.0.0.1:6379> lpush mykey a b c d a c 
(integer) 6 
#从头部(left)向尾部(right)操作链表,删除2个值等于a的元素,返回值为实际删除的数量 
127.0.0.1:6379> lrem mykey 2 a 
(integer) 2 
#查看删除后链表中的全部元素 
127.0.0.1:6379> lrange mykey 0 ­-1 
1) "c" 
2) "d" 
3) "c" 
4) "b" 
#获取索引值为1(头部的第二个元素)的元素值 
127.0.0.1:6379> lindex mykey 1 
"d" 
#将索引值为1(头部的第二个元素)的元素值设置为新值e 
127.0.0.1:6379> lset mykey 1 e 
OK 
#查看是否设置成功 
127.0.0.1:6379> lindex mykey 1 
"e"
 #索引值6超过了链表中元素的数量,该命令返回nil 
 127.0.0.1:6379> lindex mykey 6 
 (nil) 
 #设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息。 
 127.0.0.1:6379> lset mykey 6 h 
 (error) ERR index out of range 
 #仅保留索引值0到2之间的3个元素,注意第0个和第2个元素均被保留。 
 127.0.0.1:6379> ltrim mykey 0 2 
 OK 
 #查看trim后的结果 
 127.0.0.1:6379> lrange mykey 0 ­-1 
 1) "c" 
 2) "e" 
 3) "c"
  • linsert
127.0.0.1:6379> del mykey 
(integer) 1 
#准备测试数据 
127.0.0.1:6379> lpush mykey a b c d e 
(integer) 5 
#在a的前面插入新元素a1 
127.0.0.1:6379> linsert mykey before a a1 
(integer) 6 
#查看是否插入成功,从结果看已经插入 
127.0.0.1:6379> lrange mykey 0 -­1 
1) "e" 
2) "d" 
3) "c" 
4) "b" 
5) "a1" 
6) "a" 
#在e的后面插入新元素e2,从返回结果看已经插入成功 
127.0.0.1:6379> linsert mykey after e e2 
(integer) 7 
#再次查看是否插入成功 
127.0.0.1:6379> lrange mykey 0 -­1 
1) "e" 
2) "e2" 
3) "d" 
4) "c" 
5) "b" 
6) "a1" 
7) "a" 
#在不存在的元素之前或之后插入新元素,该命令操作失败,并返回­1 
127.0.0.1:6379> linsert mykey after k a 
(integer) -­1 
#为不存在的Key插入新元素,该命令操作失败,返回0 
127.0.0.1:6379> linsert mykey1 after a a2 
(integer) 0
  • rpush
  • rpushx
  • rpop
  • rpoplpush
127.0.0.1:6379> del mykey 
(integer) 1 
#从链表的尾部插入参数中给出的values,插入顺序是从左到右依次插入 
127.0.0.1:6379> rpush mykey a b c d 
(integer) 4 
#查看链表中的元素,注意元素的顺序 
127.0.0.1:6379> lrange mykey 0 ­-1 
1) "a" 
2) "b" 
3) "c" 
4) "d" 
#该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部。 
127.0.0.1:6379> rpushx mykey e 
(integer) 5 
#由于mykey2键并不存在,因此该命令不会插入数据,其返回值为0。 
127.0.0.1:6379> rpushx mykey2 e 
(integer) 0 
#查看链表中所有的元素 
127.0.0.1:6379> lrange mykey 0 -­1 
1) "a" 
2) "b" 
3) "c" 
4) "d" 
5) "e" 
#从尾部(right)弹出元素,即取出元素 
127.0.0.1:6379> rpop mykey "e" 
#查看链表中所有的元素 
127.0.0.1:6379> lrange mykey 0 ­-1 
1) "a" 
2) "b" 
3) "c" 
4) "d" 
#创建mykey2 
127.0.0.1:6379> lpush mykey2 m n  
(integer) 2 
#将mykey的尾部元素弹出,然后插入到mykey2的头部(原子性的完成这两步操作) 
127.0.0.1:6379> rpoplpush mykey mykey2 
"d" 
#通过lrange命令查看mykey在弹出尾部元素后的结果 
127.0.0.1:6379> lrange mykey 0 -­1 
1) "a" 
2) "b" 
3) "c" 
#通过lrange命令查看mykey2在插入元素后的结果 
127.0.0.1:6379> lrange mykey2 0 -­1 
1) "d"
2) "n" 
3) "m" 
127.0.0.1:6379>  
#将source和destination设为同一键,将mykey中的尾部元素移到其头部 
127.0.0.1:6379> rpoplpush mykey mykey "c" 
#查看结果 
127.0.0.1:6379> lrange mykey 0 ­-1 
1) "c" 
2) "a" 
3) "b"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值