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()]));

内存淘汰策略

磁盘持久化

集群

哨兵模式

支持事务

posted @ 2022-04-21 01:03  RolloTan  阅读(22)  评论(0编辑  收藏  举报