Redis基础数据结构

Posted lyy12332133

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis基础数据结构相关的知识,希望对你有一定的参考价值。

一、基于docker方式安装redis

  > docker pull redis

  > docker run -d --name redis -p6379:6379 redis --requirepass "lyy12332133"

  > docker exec -it redis redis-cli

  > 127.0.0.1:6379> auth lyy12332133

  > OK

通过几个简单的命令就可以进入控制台了

二、5种基础数据结构

redis有5种基础数据结构,string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合),下面一一介绍。

1、string(字符串)

字符串是redis种最简单的数据结构,内部表示就是一个字符数组,可以修改,内部结构类似java的ArrayList,采用预分配空间的方式减少频繁的内存分配。当长度小于1M时,扩容是两倍扩容,超过1M时,每次扩容1M,最大长度为512M。

通过 help @string 命令可以列出string的所有操作指令,并有解释。

127.0.0.1:6379> set name yangyang     设置一个值(K:name,V:yangyang)
OK
127.0.0.1:6379> get name                      获取一个值
"yangyang"
127.0.0.1:6379> exists name                  判断key是否存在 返回值 0不存在 1存在
(integer) 1
127.0.0.1:6379> del name                      删除一个键值对
(integer) 1
127.0.0.1:6379> get name
(nil)

------------------------------------------------------------------------------------------------------------------

可以批量修改节省网络开销

127.0.0.1:6379> set name1 yangyang
OK
127.0.0.1:6379> set name2 dazui
OK
127.0.0.1:6379> mget name1 name2       批量获取,返回一个列表
1) "yangyang"
2) "dazui"
127.0.0.1:6379> mset name1 java name2 python name3 go     批量修改
OK
127.0.0.1:6379> mget name1 name2 name3
1) "java"
2) "python"
3) "go"

------------------------------------------------------------------------------------------------------------------

可以对key设置过期时间,可用用来控制缓存的失效时间

127.0.0.1:6379> set name yangyang
OK
127.0.0.1:6379> get name
"yangyang"
127.0.0.1:6379> expire name 5                 设置5s 后过期
(integer) 1
127.0.0.1:6379> get name
(nil)

127.0.0.1:6379> setex name 5 yangyang            5s 后过期,等价于set+expire
OK
127.0.0.1:6379> setnx name yangyang               如果key不存在就创建
(integer) 1
127.0.0.1:6379> setnx name yangyang               因为已经存在所以返回0
(integer) 0

127.0.0.1:6379> get name                                   值还是yangyang
"yangyang"

------------------------------------------------------------------------------------------------------------------

如果value值是一个整数,可以进行自增操作,大范围是C语言long的最小值和最大值之间(8个字节)

127.0.0.1:6379> set index 5
OK
127.0.0.1:6379> incr index                   自增1
(integer) 6
127.0.0.1:6379> incrby index 100        加100
(integer) 106
127.0.0.1:6379> incrby index -50         加-50
(integer) 56
127.0.0.1:6379> incrby index 99999999999999999999999999999999999999
(error) ERR value is not an integer or out of range         超出最大范围后报错

 

2、list(列表)

redis的列表相当于java里面的LinkedList(双向链表),list可以用来当做队列和栈使用。

同样的可以使用 help @list 命令查看list的相关操作指令,介绍非常详细。

右侧进左侧出(先进先出)队列

127.0.0.1:6379> rpush fruits apple banaba orange       从右侧一次插入
(integer) 3
127.0.0.1:6379> llen fruits                                             获取list长度
(integer) 3
127.0.0.1:6379> lpop fruits                                            从左侧取出一个
"apple"
127.0.0.1:6379> lpop fruits
"banaba"
127.0.0.1:6379> lpop fruits
"orange"
127.0.0.1:6379> lpop fruits
(nil)

------------------------------------------------------------------------------------------------------------------

右边进右边出(后进先出)栈

127.0.0.1:6379> rpush fruits apple banaba orange
(integer) 3
127.0.0.1:6379> rpop fruits                                   从右边取出一个
"orange"
127.0.0.1:6379> rpop fruits
"banaba"
127.0.0.1:6379> rpop fruits
"apple"
127.0.0.1:6379> rpop fruits
(nil)

------------------------------------------------------------------------------------------------------------------

lindex相当于get(int intdex),链表结果需要遍历,时间复杂度O(n)

ltrim start end  保留这个区间内的元素

index可以为负数,-1表示从右数第一个元素,-2表示从右数第二个元素(相当于Python中列表的操作)

127.0.0.1:6379> rpush fruits apple banana orange
(integer) 3
127.0.0.1:6379> lindex fruits 1                 获取index为1的元素   O(n)
"banana"
127.0.0.1:6379> lindex fruits -3                获取从右数第三个元素
"apple"
127.0.0.1:6379> lrange fruits 0 -1            获取某个范围内的元素,0 ~  -1就是全部
1) "apple"
2) "banana"
3) "orange"
127.0.0.1:6379> ltrim fruits 1 -1               保留1~-1之间的元素,左数第一个元素apple被抛弃了
OK
127.0.0.1:6379> lrange fruits 0 -1
1) "banana"
2) "orange"
127.0.0.1:6379> llen fruits
(integer) 2

 

3、hash(字典)

redis的hash相当于java中的HashMap,hash的值只能是字符串。

同上 help @hash 获取所有指令

127.0.0.1:6379> hset yangyang age 18                    设置k-age;v-18
(integer) 1
127.0.0.1:6379> hset yangyang stature 194
(integer) 1
127.0.0.1:6379> hset yangyang weight 88
(integer) 1
127.0.0.1:6379> hgetall yangyang                           获取所有,K,V间隔出现
1) "age"
2) "18"
3) "stature"
4) "194"
5) "weight"
6) "88"
127.0.0.1:6379> hlen yangyang                              获取长度
(integer) 3
127.0.0.1:6379> hget yangyang age                       获取单个key
"18"
127.0.0.1:6379> hset yangyang age 20                  修改
(integer) 0
127.0.0.1:6379> hget yangyang age
"20"
127.0.0.1:6379> hmset yangyang age 30 stature 180 weight 70        批量修改
OK
127.0.0.1:6379> hmget yangyang age stature weight                         批量获取
1) "30"
2) "180"
3) "70"
127.0.0.1:6379> hincrby yangyang age 1                                            同string一样,计数操作
(integer) 31

4、set(集合)

redis中的set相当于java中的HashSet, 内部实现是hash,所有value都为NULL。无需不重复。

同上 help @set

127.0.0.1:6379> sadd fruits apple                    添加一个元素
(integer) 1
127.0.0.1:6379> sadd fruits banaba
(integer) 1
127.0.0.1:6379> sadd fruits orange
(integer) 1
127.0.0.1:6379> smembers fruits                    获取所有,顺序和添加的时候不一致
1) "banaba"
2) "apple"
3) "orange"
127.0.0.1:6379> sismember fruits apple       判断是否存在,是1不是0
(integer) 1
127.0.0.1:6379> sismember fruits pear
(integer) 0

127.0.0.1:6379> scard fruits                         判断元素个数,size()
(integer) 3
127.0.0.1:6379> spop fruits                          弹出一个
"banaba"

 

5、zset(有序集合)

zset 给每一个value赋予一个socre,根据这个score进行权重排序,类似java中的SortedSet,内部实现是跳表。

同上 help @sorted_set

127.0.0.1:6379> zadd fruits 1 apple            
(integer) 1
127.0.0.1:6379> zadd fruits 3 banana
(integer) 1
127.0.0.1:6379> zadd fruits 2 orange
(integer) 1
127.0.0.1:6379> zrange fruits 0 -1          按score排序列出
1) "apple"
2) "orange"
3) "banana"
127.0.0.1:6379> zrevrange fruits 0 -1     按score排序倒序列出
1) "banana"
2) "orange"
3) "apple"
127.0.0.1:6379> zcard fruits                    size()
(integer) 3
127.0.0.1:6379> zscore fruits apple         获取元素score
"1"
127.0.0.1:6379> zrank fruits orange         获取元素排名,0开始
(integer) 1
127.0.0.1:6379> zrangebyscore fruits 1 2.1      根据分值区间遍历
1) "apple"
2) "orange"

127.0.0.1:6379> zrem fruits apple            删除元素
(integer) 1
127.0.0.1:6379> zrange fruits 0 -1
1) "orange"
2) "banana"

 

以上即为Redis提供的5中基础数据类型及其常用命令,全部命令可以通过help @xxx 来查看,介绍非常详细。

list、hash、set、zset是容器类型,如果容器不存在就创建,如果容器中最有一个元素被删除,容器也被删除。

redis所有的数据结构都可以设置过期时间,容器类型的数据过期时间是整个容器的生命周期,不是某个元素。如果字符串已经设置了过期时间,未过期前用set方法修改,过期时间会失效。

 

以上是关于Redis基础数据结构的主要内容,如果未能解决你的问题,请参考以下文章

redis教程-基础数据结构

redis使用基础 ——Redis数据类型

redis 基础

redis 基础数据结构

redis使用基础 ——Redis数据持久化

redis-基础数据结构一