简介
Redis数据就是以key-value形式来存储的,key只能是字符串类型,value可以是以下五种类型:String、List、 Set、SortedSets、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"