Redis 基础
Redis 基础
官方文档
什么是 redis ?
- redis 是一款基于 BSD许可 的开源项目
- 采用 内存数据结构 存储,可以用来做 数据库 / 缓存 / 消息中间件 / 流引擎
docker 运行 redis
- 拉取最新版本的 redis 镜像:
- docker pull redis
- 运行:
- docker run -p 6379:6379 --name redisdb -v d:/docker-redis/redis:/etc/redis -v d:/docker-redis/data:/data --restart=always -d redis
- 进入容器 & 打开客户端
- docker exec -it redisdb /bin/bash
- redis-cli
数据类型(常用)
1. Strings
- 是 redis 中最基本的值类型
- 一个 String 的值,最大可以有 512 MB
常用命令:
- 设置值: set mykey value [...]
- 获取值: get mykey
应用场景:
- 分布式锁
2. Lists
- 是简单的字符串列表,按插入顺序排序
- 一个 list 的大小,最大可以有 2^32 - 1 个元素(即 4,294,967,295 个元素的大小限制)【官网: lpush + ltrim 操作可以突破这一限制】
- 可以头部插入(on the left),也可以尾部插入(on the right)
特性:
- 可以在恒定时间,插入和删除元素,在头部和尾部(支持的并发量大,百万级别)
- 访问元素的速度非常快,但如果是访问大量数据 list 的中部就比较慢了,因为这是个 O(n) 操作
常用命令:
-
头部插入: lpush mykey [element]
-
尾部插入: rpush mykey [element]
-
范围查询左边起: lrange mykey startIndex stopIndex
- stopIndex 为 -1,表示从 startIndex 起查询全部
-
头部弹出: lpop mykey [count]
-
尾部弹出: rpop mykey [count]
-
删除lists ?
- list内元素为空,自然会从 redis 的 key空间 中移除了该 list 的 key
- 同理的在插入元素时,如果 list 不存在,redis 就会创建
list 高级玩法
- redis 的 list 用作一个 消息传递的原语(message passing primitive)
- 支持多种命令,包括像 blpop 这样的阻塞命令
应用场景:
- 在社交网络中建模时间轴,使用LPUSH在用户时间线上添加新元素,使用LRANGE检索最近插入的一些项目
- 把 list 当做消息中间件的 队列,即list 成了 消息队列(生产者往 list 的一端加入消息,消息者从 list 的另一端取出消息来消费)
3. Sets
- 是一个无序的字符串集合,元素不重复
- 一个 set 的大小,最大可以有 2^32 - 1 个元素(即 4,294,967,295 个元素的大小限制)
特性:
- 时间复杂 O(1),新增 / 删除 / test元素是否存在
- 支持很多服务器命令从现有的 set 中计算集合的 并集 / 交集 / 差异,在很短的时间内完成
常用命令:
-
插入元素: sadd mykey [element]
-
查看全部元素: smembers mykey
-
随机查看元素: srandmember mykey [count]
-
移动元素: smove mykey1 mykey1 [element]
-
弹出元素: spop mykey [count]
应用场景:
- 追踪唯一的事情,比如访问给定博客文章的所有唯一的 IP 地址
- 创建标签系统时用 set 来代表对象所拥有的 tag(标签),添加标签就用 sadd 命令,指定对象共有的标签可以用 sinter 命令
4. Hashes
- 是字符串 field 和字符串 value 的 map(映射)
- 一个 hash 的大小,最大可以有 2^32 - 1 个 key-value
特性:
- 节省空间
- 主要用来表示对象,但因 hash 能存储许多元素,也可以做更多事情
常用命令:
-
创建&设置field-value: hset key [field-value]
-
创建&设置多个field-value: hmset key [field-value]
-
获取一个hash的一个field的值: hget key [field]
-
获取一个hash的所有field&值: hgetall key
-
获取一个hash的所有fields: hkeys key
-
获取一个hash的所有values: hvals key
-
获取一个hash的field的个数: hlen key
-
判断一个hash的field是否存在: hexists key [field]
-
移除一个或多个field: hdel key [field]
应用场景:
- 存储对象数据,像java的 Map 一样
5. Sorted Sets
- 与set 类似,是一个元素不重复的字符串集合,不同的是 sorted set 中每个元素都会与一个分数关联(以排序)
特性:
- 增/删/改所耗费的时间与元素数量的对数成正比
- 访问 sorted set 中部的元素的速度是很快的
常用命令:
- 增/改元素: zadd key [option] [score-element]
- be like: zadd mykey 1 "first"
- option:
-
XX -- 只更新已经存在的数据,不新增
-
NX -- 只新增新元素,不修改
-
LT -- 只更新存在的元素,如果新 score 低于当前 score,不阻碍新增
-
GT -- 只更新存在的元素,如果新 score 高于当前 score,不阻碍新增
-
CH -- 将返回值从添加的新元素数修改为更改的元素总数(CH是changed的缩写)
-
INCR -- 让 zadd 的行为像 zincrby 命令一样,但只能指定一对 score-element
-
应用场景:
- 大型游戏排名榜(根据分数来排的)【更新分数快】 zadd
- 检索顶级用户,并返回排名(根据分数来排)【查询快】 zrange & zrank
- Sorted Sets通常用于索引存储在Redis内部的数据 【当索引来用】 zrangebyscore
redis key 的维护
模糊查询 key
符号 * -- 模糊匹配
符号 ? -- 占位匹配
符号 [] -- in 匹配
-- 查询所有 key
> keys *
-- 查询包含 keyword 的 key
> keys *keyword*
-- 占位匹配
> keys keywo??
-- 包含字符匹配
> keys keywor[dxy]
批量删除 key
jedis方式
// 定义匹配key
String pattern = "keywor*"
// 获取匹配到的key集合
Set<String> keys = jedis.keys(pattern);
// 执行删除
jedis.del(keys.toArray(new String[keys.size()]));