标签: Redis
Redis RediSearch
RediSearch 是一个高性能的全文搜索引擎,它可以作为一个 Redis Module(扩展模块)运行在 Redis 服务器上。
RediSearch

SpringBoot Redis布隆过滤器
Redis 中不能直接使用布隆过滤器,Redis 4.0 版本之后提供的 modules(扩展模块)
布隆过滤器的原理
- 数据结构使用一位的数组,每次存储键值的时候,不是直接把数据存储在数据结构中。而是经过hash运算。将此元素的 hash 值均匀的存储在位数组中。把这些位置设置成 1 就完成了添加操作。
- 判断元素是否存在时,经过运算判断对应的位置是否为全部1即可。因此布隆过滤器查询此值存在时,此值不一定存在,但查询此值不存在时,此值一定不存在。
- 但是存在一定的误差,并且当位数组存储值比较稀疏的时候,查询的准确率越高,而当位数组存储的值越来越多时,误差也会增大。
Redis 扫描
Scan
游标迭代器
大于 2.8.0 版本可用。
**时间复杂度:**每次调用 O(1)。O(N) 用于完整的迭代,包括足够的命令调用以使光标返回 0。N 是集合内的元素数。
-
在 Redis 2.8 之前,我们只能使用 keys 命令来查询我们想要的数据,但这个命令存在两个缺点:
-
此命令没有分页功能,我们只能一次性查询出所有符合条件的 key 值,如果查询结果非常巨大,那么得到的输出信息也会非常多。
-
keys 命令是遍历查询,因此它的查询时间复杂度是 o(n),所以数据量越大查询时间就越长。
-
Scan:用于检索当前数据库中所有数据。
-
HScan:用于检索哈希类型的数据。
-
SScan:用于检索集合类型中的数据。
-
ZScan:由于检索有序集合中的数据。
SpringBoot Redis 延时队列
之前有介绍过SpringBoot-Delayed-Queue基于jdk实现DelayedQueue。在实际开发中使用redis zset来实现的也比较常见。
- Redis 延迟队列实现的思路,利用 zrangebyscore 查询符合条件的所有待处理任务,循环执行队列任务。或者每次查询最早的一条消息,判断这条信息的执行时间是否小于等于此刻的时间,如果是则执行此任务,否则继续循环检测。
Redis-Sorted-Sets
每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
企业架构分布式锁
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性。
锁
锁是一种常用的并发控制机制,用于保证一项资源在任何时候只能被一个线程使用,如果其他线程也要使用同样的资源,必须排队等待上一个线程使用完。

Docker Compose SpringBoot MySQL Redis
在Java的技术栈中可以使用maven插件来构建docker镜像,用起来没有docker-compose好用。
实现目标
- spring boot 、mysql 、redis 定义正常运行。
- 解决docker compose 启动顺序问题。
- 解决配置文件读取其它容器ip问题。
源码地址
Docker Compose Redis 哨兵
上次编写了Docker-Compose-Redis-Master-Slave的文档,完成了简单的主从配置。这次在上次的基础上增加哨兵监控。
编写docker-compose配置文件
- 这里和上次的使用同一个网桥
- Docker-compose 文件和 sentinel配置文件放在同一个目录下。
Docker Compose Redis 主从
Redis Geo
源码地址
Geo
Redis 在 3.2 版本中增加了 GEO 类型用于存储和查询地理位置。
-
GEOADD:添加地理位置
-
GEOPOS:查询位置信息
-
GEODIST:距离统计
-
GEORADIUS:以给定的经纬度为中心, 找出某一半径内的元素
-
GEORADIUSBYMEMBER 找出位于指定范围内的元素,中心点是由给定的位置元素决定
-
GEOHASH:返回一个或多个位置元素HASH
-
关于删除,使用集合函数中的zrem,geo本质存在一个集合中。
Docker Compose Redis MySQL
记录下使用docker-compose构建管理Redis、mysql。
准备工作
- 创建工作目录
$ mkdir -p docker docker/mysql docker/mysql/data docker/redis docker/redis/data
# 使用 tree docker 查看目录结构 yum -y install tree 安装
$ tree docker
docker
├── mysql
│ └── data
└── redis
└── data
$ touch docker/mysql/my.cnf docker/redis/redis.conf
$ tree docker
docker
├── mysql
│ ├── data
│ └── my.cnf
└── redis
├── data
└── redis.conf
Redis CLI
在mac中使用redis-cli。相比rdm我可能更喜欢这个命令行工具。
在mac中之安装redis-cli
按照标准的按照流程,需要先安装redis-server。
brew tap ringohub/redis-cli
brew update && brew doctor
brew install redis-cli
SpringBoot Redis 超时错误
最近在看项目的时候发现一个临时问题,就是redis.timeout设置0依然超时的问题。
- 代码适用版本
jedis:2.9.0,org.springframework.data.redis:1.8.1
timeout设置0的问题
spring.redis.timeout =0 如果设置成0 redis默认超时时间就是2秒.

Docker Compose Redis 缓存击穿
关于Redis场景下简单的处理方式。
缓存穿透和缓存击穿
- 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
- 解决办法
- 缓存空对象:代码维护较简单,但是效果不好。不过部分场景能使用。
Spring Redis 字符串
本章是整理知识内容,为强化知识长期更新。
spring-redis-string
Spring-data-redis 有两个客户端,本章节主要使用lettuce来作为代码演示。尽可能面向redis编程。
- 参考文献redis-string
Docker Redis 部署
本章是整理知识内容,为强化知识长期更新。
Docker环境下部署redis
确认已经安装好了Docker环境
windows 和 linux 可以用 docker info检查是否安装
- 在mac下就是这么个情况。需要注意的是,请不用使用email登录,否则在查找官方镜像的时候会抛出认证失败的问题。比如我是登录用户
z201
docker查找镜像
Redis基础(二)
本章是整理知识内容,为强化知识长期更新。
set扩展
- 分布式锁的简单实现
- 在日常开发中,redis主要用在缓存处理。为保证缓存所以会使用集群的方式,避免缓存雪崩。都使用集群了应用层也不太可能是单应用。在分布式的情况下就会涉及分布式锁。a应用和b应用一起对某条缓存记录操作,a查完数据在内存修改,在放回去。如果这个操作两个应用同时进行就会出现并发问题。为了保证操作的原子性,所以就要使用锁来保证操作执行的顺序。
# 使用set的扩展命令 一次把expire和 setnx的特性带上。下面这条命令就是 过期时间5s 并且不可以重复添加。只能删除或者到期。
192.168.31.7:6379> set lock:redis true ex 5 nx
OK
192.168.31.7:6379> set lock:redis true ex 5 nx # 第二次在设置就失败了。
(nil)
Redis基础(一)
本章是整理知识内容,为强化知识长期更新。
Redis
- Redis是一个速度非常快的
非关系型数据库(non-relationl databases),它可以是存储键对值(key-vakue)方式存储数据。它拥有5中数据类型。同时可以将存储在内存中的数据持久化到因硬盘中。 - Redis所有的数据都是以唯一的key字符串为名称,然后可以通过这个key来获取对应的value。
| 结构类型 | 结构存储的值 | 结构的读写能力 |
|---|---|---|
| STRING | 可以是字符串、整数或者浮点类型 | 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数据执行自动或者自减操作 |
| LIST | 一个链表、链表每个节点上都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表记性修剪trim;读取单个或者多个元素;根据值查询或者移除元素。 |
| SET | 包含字符串的无序集合,并且每个被包含的字符串都是唯一约束 | 添加、查询、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素。 |
| HASH | 包含键值对的无序散列表 | 添加、查询、移除单个键值对;获取全部键对值。 |
| ZSET(有序集合) | 字符串与浮点分数之间的有序映射,元素的排列顺序由分值大决定。 | 添加、查询、移除单个元素;根据分值范围或者成员来获取元素。 |
Redis
本章是整理知识内容,为强化知识长期更新。
Redis 简介
Redis 是完全开源免费的,遵守 BSD 协议,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- Redis 与 其他 key - value 缓存产品有以下三个特点:
- Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis 不仅仅支持简单的 key - value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储
- Redis 支持数据的备份,即 master - slave 模式的数据备份。
- Redis是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快,读的速度是 110000 次 /s, 写的速度是 81000 次 /s。另一方面是因为它的数据结构。键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是 Redis 快速处理数据的基础。
- Redis使用基于哈西槽(slot)的数据划分方式。
CentOS7 Redis 部署
Redis全称:Remote Dictionary Server(远程数据服务)。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
单实例安装
只是学习使用使用yum 方式安装比较快。而且centos自带官方源。
yum安装
- yum install epel-release --下载fedora的epel仓库
- yum install redis -- 安装redis数据库