Redis数据类型与命令

Redis有5种基础数据结构,分别为:string(字符串),list(列表),hash(字典),set(集合),zset(有序集合)。

string

字符串 string 是 Redis 最简单的数据结构,做简单的 key-value 缓存,内部结构是一个字符数组。

  • 键值对操作
# set命令
127.0.0.1:6379> set name muskmelon
OK
# get命令
127.0.0.1:6379> get name
"muskmelon"
# exists命令
127.0.0.1:6379> exists name
(integer) 1
# del命令
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
  • 批量操作
127.0.0.1:6379> mset name1 apple name2 huawei
OK
127.0.0.1:6379> mget name1 name2
1) "apple"
2) "huawei"
  • 过期操作
127.0.0.1:6379> set name muskmelon
OK
127.0.0.1:6379> get name
"muskmelon"
# 5秒过期
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> get name
(nil)
# setex 命令, 5秒过期 
127.0.0.1:6379> setex name 5 muskmelon
OK
127.0.0.1:6379> get name
"muskmelon"
# 过5秒操作
127.0.0.1:6379> get name
(nil)

# 如果key:name不存在,执行set操作
127.0.0.1:6379> setnx name muskmelon
(integer) 1
127.0.0.1:6379> get name
"muskmelon"
# key存在,set执行失败
127.0.0.1:6379> setnx name muskmelon-new
(integer) 0
127.0.0.1:6379> get name
"muskmelon"
  • 计数
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19
127.0.0.1:6379> incrby age 5
(integer) 24
127.0.0.1:6379> incrby age -3
(integer) 21
# 自增最大值 Long.Max
127.0.0.1:6379> set maxlength 9223372036854775807
OK
# 超过最大值,出错
127.0.0.1:6379> incr maxlength
(error) ERR increment or decrement would overflow

list

列表 list 相当于 Java 里的 LinkedList ,是个链表不是数组

  • 使用场景

    • 有序列表,例如:微博某个大V的粉丝,可以以 list 的格式放在 redis 里去缓存
    • 通过 list 存储一些列表类型的数据结构,类似粉丝列表,文章的评论列表
    • 通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于list实现分页查询
    • 可以搞个简单的消息队列,从 list 头怼进去,从 list 尾巴弄出来
  • 右边进左边出:队列 (先进先出)

# rpush 右入list
127.0.0.1:6379> rpush books java python go c++
(integer) 4
# llen 查list长度
127.0.0.1:6379> llen books
(integer) 4
# lpop 左出list
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lpop books
"go"
127.0.0.1:6379> lpop books
"c++"
127.0.0.1:6379> lpop books
(nil)
  • 右边进右边出:栈 (先进后出)
127.0.0.1:6379>  rpush books java python go c++
(integer) 4
# rpop 右出
127.0.0.1:6379> rpop books
"c++"
127.0.0.1:6379> rpop books
"go"
127.0.0.1:6379> rpop books
"python"
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> rpop books
(nil)
  • 慢操作
127.0.0.1:6379> rpush books java go python c++
(integer) 4
# 查找索引位置元素,从0开始
127.0.0.1:6379> lindex books 2
"python"
# 查找列表所有元素
127.0.0.1:6379> lrange books 0 -1
1) "java"
2) "go"
3) "python"
4) "c++"
# 查找列表指定索引区间元素
127.0.0.1:6379> lrange books 0 2
1) "java"
2) "go"
3) "python"
# 保留列表索引区间元素
127.0.0.1:6379> ltrim books 1 -1
OK
127.0.0.1:6379> lrange books 0 -1
1) "go"
2) "python"
3) "c++"
# 区间范围长度为负数,相当于清空了列表
127.0.0.1:6379> ltrim books 1 0
OK
127.0.0.1:6379> llen books
(integer) 0

hash

字典 hash 相当于 Java 里的 HashMap ,是无序的,内部存储了很多键值对,比较适合存储对象

# hset
127.0.0.1:6379> hset user name muskmelon
(integer) 1
127.0.0.1:6379> hset user age 18
(integer) 1
127.0.0.1:6379> hset user weight 140
(integer) 1
# hgetall 获取所有数据
127.0.0.1:6379> hgetall user
1) "name"
2) "muskmelon"
3) "age"
4) "18"
5) "weight"
6) "140"
# hlen 计算hash有多少个field
127.0.0.1:6379> hlen user
(integer) 3
# hget key field  获取指定field数据
127.0.0.1:6379> hget user name
"muskmelon"
# hmset 批量设置
127.0.0.1:6379> hmset user name zhangsan age 20
OK
127.0.0.1:6379> hgetall user
1) "name"
2) "zhangsan"
3) "age"
4) "20"
5) "weight"
6) "140"
# hincrby 递增
127.0.0.1:6379> hincrby user age 5
(integer) 25

set

集合 set 相当于 Java 里的 HashSet,无序集合,自动去重,可以基于 set 做交集,并集,差集;
比如 把两个人的粉丝列表整一个交集,看看两人的共同好友是谁

# sadd 添加元素
127.0.0.1:6379> sadd books java
(integer) 1
# sadd 重复项添加失败
127.0.0.1:6379> sadd books java
(integer) 0
127.0.0.1:6379> sadd books go
(integer) 1
127.0.0.1:6379> sadd books python
(integer) 1
# smembers 列举所有元素
127.0.0.1:6379> smembers books
1) "python"
2) "go"
3) "java"
# scard 获取集合长度
127.0.0.1:6379> scard books
(integer) 2
# sismember 校验某个value是否存在
127.0.0.1:6379> sismember books java
(integer) 1
127.0.0.1:6379> sismember books c++
(integer) 0
# spop 随机弹一个
127.0.0.1:6379> spop books
"java"

zset

有序集合 zset 类似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证唯一性,另一方面每个 value 都有一个 score ,代表排序的权重,内部由跳跃列表结构

  • 使用场景
    • 可以用来存储粉丝列表,value 值是粉丝的用户ID,score是关注时间,可以对粉丝列表按关注时间排序
    • 排行榜,将每个用户以及对应的分数写进去,获取排名前20的用户
# zadd 插入元素
127.0.0.1:6379> zadd books 9.5 "java"
(integer) 1
127.0.0.1:6379> zadd books 8.3 "go"
(integer) 1
127.0.0.1:6379> zadd books 8.0 "python"
(integer) 1
# zrange key 0 -1 获取所有元素
127.0.0.1:6379> zrange books 0 -1
1) "python"
2) "go"
3) "java"
# zrevrange key 0 -1 倒序获取所有元素
127.0.0.1:6379> zrevrange books 0 -1
1) "java"
2) "go"
3) "python"
# zcard 获取元素个数
127.0.0.1:6379> zcard books
(integer) 3
# zscore 获取元素得分
127.0.0.1:6379> zscore books "java"
"9.5"
# zrangebyscore 根据得分区间查询
127.0.0.1:6379> zrangebyscore books 5 9
1) "python"
2) "go"
# zrem 删除元素
127.0.0.1:6379> zrem books "java"
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "python"
2) "go"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值