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基础数据结构的主要内容,如果未能解决你的问题,请参考以下文章