Redis 基础
基本命令
通用命令
-
select
示例:
1 2
select 0 # 选择0号数据库
-
keys
示例:
1 2 3 4 5
keys he* keys he[h-l]* keys ph? # 根据Pattern表达式查询符合条件的Key # 注意:不要在生产环境中使用,会阻塞线程
-
dbsize
示例:
1 2
dbsize # 返回key的总数
-
exists
示例:
1 2
exists a # 查询key=a是否存在
-
del
示例:
1 2
del a # 删除key=a的数据
-
expire
示例:
1 2
expire hello 20 # 设置key=hello 在20s后过期
-
ttl
示例:
1 2
ttl hello # 查看key=a的过期剩余时间
-
flashdb
示例:
1 2
flashdb # 清空当前数据库中的所有数据
-
flashall
示例:
1 2
flashall # 删除所有数据库中的所有数据
Redis 常用的五种数据结构
Redis 数据类型 - 字符串
value可以是字符串,可以是数字,可以是位数字
String最大512MB,建议单个KV不超过100KB
字符串结构应用类型
- 缓存
- 秒杀
- 分布式锁
- 配置中心
- 对象序列化
- 计数器
Redis 字符串指令
-
get
示例:
1 2
get hello # 获得key=hello的结果
-
set
示例:
1 2
set hello world # 设置key=hello , value=world
-
mset / mget
示例:
1 2 3
mset hello world java best mget hello java # 一次性 设置 或者 获取 多个kv
-
getset
示例:
1 2
setget db mongodb # 设置新值返回旧值,若没有旧值则返回null并赋予新值
-
setnx
1 2 3
setnx job programmer setnx job farmer # 执行失败 # 指定key不存在时设置,若存在则不设置
-
del
示例:
1 2
del hello # 删除key=hello的数据
-
incr / decr
示例:
1 2 3
incr count decr count # key值 自增 / 自减 1
-
incrby / decrby
示例:
1 2 3
incrby count 99 decrby count 99 # key值 自增 / 自减 指定步长
Redis 数据类型 - hash
Redis hash 是一个 string 类型的 field (字段) 和 value (值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 2^32^ -1 个键值对(40多亿)。可以理解为每个key存储了一个HashMap对象,通过一个Key可以保存一个数据结构。
hash应用场景
Hash用于存储结构化数据,比如员工i谢谢你,用户信息等等
Redis Hash 命令
-
hset
示例:
1 2
hset myhash field "foo" # 设置单个hash字值段
-
hmset
1 2
hmset myhash field1 "hello" field2 "world" # 设置多个hash字值段
-
hget
1 2
hget myhash field1 # 提取一个redis的key的某个哈希值
-
hgetall
1 2
hgetall myhash # 提取一个redis的key的所有哈希值,以键/n值/n的形式返回
-
hexists
1
hexists myhash field
-
hdel
1 2
hdel myhash field1 filed2 # 删除n条记录
-
hval
1 2
hval myhash # 返回hash的value的列表,key不存在返回空表
Redis 数据类型 - List
List列表是简单的字符串列表,按照插入顺序排序。可以添加元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2^32^-1个元素
List 应用场景
保存有需数据队列,例如:排行榜ID队列 / XX购物车商品ID队列 / XX班级ID队列
获取到ID队列后,再根据每一个ID获取对应的HASH对象
Redis List 命令
-
rpush
1 2
rpush listkey c b a # 在队尾插入新数据
-
lpush
1 2
lpush listkey f e d # 在队首插入新数据
-
lrange
1 2 3 4 5 6
lrange listkey 0 -1 # d e f c b a # 获取所有 lrange listkey 0 2 # d e f # 获取队列数据
-
rpop
1 2 3
rpop listkey # a # 从右侧弹出数据
-
lpop
1 2 3
lpop listkey # d # 从左侧弹出数据
Redis 数据类型 - Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,即不会存在重复的数据
Redis 中 Set 集合是通过 哈希表 实现的,故添加、删除。查找的复杂度都是O(1),对Set操作的执行效率极高
集合中的最大成员数为 2^32^-1 个元素
Redis Set 应用场景
Set数据类型常用于交际 / 并集 / 差集 运算
典型场景为:
- 我与XX位好友共同关注了XXX
- 将两个数据源的数据清单进行合并
- 找出X与Y集合的差异
- 抽奖活动
Redis Set 命令
-
sadd
1 2 3
sadd user:1:follow fay sadd user:1:follow kirov faye harry # 新增set数据
-
smembers
1 2 3
smembers user:1:follow # fay harry faye kirov (不保证顺序) # 查看set数据
-
srandmember
1 2
srandmember user:1:follow 2 # fay kirov (不保证顺序,不改变原集合中的顺序)
-
spop
1 2 3
spop user:1:follow # fay (随机且改变原集合) # 随机弹出一个元素
-
sdiff
1 2 3
sdiff user:2:follow user:1:follow # sports ent news # sdiff计算的是以左侧Set为基准,查找在右侧Set不存在的条目
-
sinter
1 2
sinter user:1:follow user:2:follow # 计算交集
-
sunion
1 2
sunion user:1:follow user:2:follow # 计算并集
Redis 数据类型 - ZSet
Redis 的 ZSet 是 String 类型的有序Set集合。集合成员是唯一的,即不会存在重复的数据
ZSet 和 List 的区别
List 强调数据是按存储顺序有序排列,存储顺序与迭代顺序是一致的
ZSet 则是给出分数进行排序,存储顺序与迭代顺序是不一致的
Redis ZSet 应用场景
各种多维度排行榜
Redis ZSet 命令
-
zadd
1 2
zadd player:ranke 1000 fay 900 kirov 800 pinkman 600 grovy # 新增数据
-
zrange
1 2 3 4 5
zrange player:rank 0 -1 # grovy pinkman kirov fay zrange player:rank 0 -1 with scores # grovy 600 pinkman 800 kirov 900 fay 1000 (将分值一并写出) # 根据分值从小到大进行排列
-
zscore
1 2
zscore play:rank fay # 获取分数
-
zrank
1 2
zrank play:rank fay # 获取排名
-
zrevrank
1 2
zrank play:rank fay # 反向排名
-
zrevrange
1 2 3
zrevrange player:rank 0 -1 zrevrange player:rank 0 -1 with scores # 反向排序
-
zrem
1 2
zrem play:rank grovy # 移除指定元素
-
zcount
1 2 3
zcount player:rank 700 1000 # 3 # 获取符合分数要求数据量
-
zrangebyscore
1 2
zrangebyscore player:rank 700 1000 wiht scores # pinkman 800 kirov 900 fay 1000
Redis 开发规约
Key 的设计
不同类型的应用场景
Redis 的安全建议
- Redis 不要在外网被访问,禁止:bind 0.0.0.0
- - bind 192.168.132.128
- 更改 Redis 端口,不要6379
- port : 8838
- Redis 使用非 root 启动
- Redis 没有设置密码或者弱密码,不要与登陆密码相同
- requirepass 与 masterauth
- 定期备份,save 命令
- 配置号 Linux 防火墙规则