Redis 基础
基本命令
通用命令
-
select
示例:
1 2select 0 # 选择0号数据库 -
keys
示例:
1 2 3 4 5keys he* keys he[h-l]* keys ph? # 根据Pattern表达式查询符合条件的Key # 注意:不要在生产环境中使用,会阻塞线程 -
dbsize
示例:
1 2dbsize # 返回key的总数 -
exists
示例:
1 2exists a # 查询key=a是否存在 -
del
示例:
1 2del a # 删除key=a的数据 -
expire
示例:
1 2expire hello 20 # 设置key=hello 在20s后过期 -
ttl
示例:
1 2ttl hello # 查看key=a的过期剩余时间 -
flashdb
示例:
1 2flashdb # 清空当前数据库中的所有数据 -
flashall
示例:
1 2flashall # 删除所有数据库中的所有数据
Redis 常用的五种数据结构
Redis 数据类型 - 字符串
value可以是字符串,可以是数字,可以是位数字
String最大512MB,建议单个KV不超过100KB
字符串结构应用类型
- 缓存
- 秒杀
- 分布式锁
- 配置中心
- 对象序列化
- 计数器
Redis 字符串指令
-
get
示例:
1 2get hello # 获得key=hello的结果 -
set
示例:
1 2set hello world # 设置key=hello , value=world -
mset / mget
示例:
1 2 3mset hello world java best mget hello java # 一次性 设置 或者 获取 多个kv -
getset
示例:
1 2setget db mongodb # 设置新值返回旧值,若没有旧值则返回null并赋予新值 -
setnx
1 2 3setnx job programmer setnx job farmer # 执行失败 # 指定key不存在时设置,若存在则不设置 -
del
示例:
1 2del hello # 删除key=hello的数据 -
incr / decr
示例:
1 2 3incr count decr count # key值 自增 / 自减 1 -
incrby / decrby
示例:
1 2 3incrby 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 2hset myhash field "foo" # 设置单个hash字值段 -
hmset
1 2hmset myhash field1 "hello" field2 "world" # 设置多个hash字值段 -
hget
1 2hget myhash field1 # 提取一个redis的key的某个哈希值 -
hgetall
1 2hgetall myhash # 提取一个redis的key的所有哈希值,以键/n值/n的形式返回 -
hexists
1hexists myhash field -
hdel
1 2hdel myhash field1 filed2 # 删除n条记录 -
hval
1 2hval myhash # 返回hash的value的列表,key不存在返回空表
Redis 数据类型 - List
List列表是简单的字符串列表,按照插入顺序排序。可以添加元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 2^32^-1个元素
List 应用场景
保存有需数据队列,例如:排行榜ID队列 / XX购物车商品ID队列 / XX班级ID队列
获取到ID队列后,再根据每一个ID获取对应的HASH对象
Redis List 命令
-
rpush
1 2rpush listkey c b a # 在队尾插入新数据 -
lpush
1 2lpush listkey f e d # 在队首插入新数据 -
lrange
1 2 3 4 5 6lrange listkey 0 -1 # d e f c b a # 获取所有 lrange listkey 0 2 # d e f # 获取队列数据 -
rpop
1 2 3rpop listkey # a # 从右侧弹出数据 -
lpop
1 2 3lpop 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 3sadd user:1:follow fay sadd user:1:follow kirov faye harry # 新增set数据 -
smembers
1 2 3smembers user:1:follow # fay harry faye kirov (不保证顺序) # 查看set数据 -
srandmember
1 2srandmember user:1:follow 2 # fay kirov (不保证顺序,不改变原集合中的顺序) -
spop
1 2 3spop user:1:follow # fay (随机且改变原集合) # 随机弹出一个元素 -
sdiff
1 2 3sdiff user:2:follow user:1:follow # sports ent news # sdiff计算的是以左侧Set为基准,查找在右侧Set不存在的条目 -
sinter
1 2sinter user:1:follow user:2:follow # 计算交集 -
sunion
1 2sunion user:1:follow user:2:follow # 计算并集
Redis 数据类型 - ZSet
Redis 的 ZSet 是 String 类型的有序Set集合。集合成员是唯一的,即不会存在重复的数据
ZSet 和 List 的区别
List 强调数据是按存储顺序有序排列,存储顺序与迭代顺序是一致的
ZSet 则是给出分数进行排序,存储顺序与迭代顺序是不一致的
Redis ZSet 应用场景
各种多维度排行榜
Redis ZSet 命令
-
zadd
1 2zadd player:ranke 1000 fay 900 kirov 800 pinkman 600 grovy # 新增数据 -
zrange
1 2 3 4 5zrange 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 2zscore play:rank fay # 获取分数 -
zrank
1 2zrank play:rank fay # 获取排名 -
zrevrank
1 2zrank play:rank fay # 反向排名 -
zrevrange
1 2 3zrevrange player:rank 0 -1 zrevrange player:rank 0 -1 with scores # 反向排序 -
zrem
1 2zrem play:rank grovy # 移除指定元素 -
zcount
1 2 3zcount player:rank 700 1000 # 3 # 获取符合分数要求数据量 -
zrangebyscore
1 2zrangebyscore 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 防火墙规则