Fivk博客 - Redis
type: channel
link: https://blog.fivk.cn/tag/Redis/
items: 【开发技巧】redis中的布隆过滤器
items: 【Redis】单机、主从、哨兵集群搭建
items: 【Redis】分布式缓存
items: 【Redis】哨兵集群搭建一键启动和暂停
items: 【Redis】SpringBoot项目Redis哨兵集群和单节点自适应
items: 【Redis】核心概念
items: 【知识总结】SSM配置Redis
items: 【Docker】docker启动redis简单方法
items: 【Redis】基础知识

【开发技巧】redis中的布隆过滤器
type: item
date: 2024-02-22T22:45:15+08:00
description: Redis中的布隆过滤器（Bloom Filter）是一种空间效率很高的数据结构，用于判断一个元素是否在一个集合中。它的特点是能够快速判断元素不在集合中；如果判断元素在集合中，这种判断有一定的误判率。布隆过滤器通过使用多个哈希函数对元素进行处理，然后将结果映射到一个位数组上。如果一个元素对应的所有位都是1，那么布隆过滤器会认为这个元素可能存在；如果任何一位不是1，则元素肯定不在集合中。Redis布隆过滤器的应用场景包括但不限于：防止缓存穿透：通过布隆过滤器预判查询的键是否存在，避免对不存在的键进行数据库查询。去重：比如邮件列表、用户邀请等场景，使用布隆过滤器快速判断元素是否已经存在。在Spring Boot中使用Redis布隆过滤器，可以通过以下步骤实现：1. 添加依赖首先，在pom.xml中添加Redis和Spring Boot相关依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>YOUR_VERSION_HERE</version> </dependency>确保版本兼容你的Spring Boot版本。2. 配置Redis在application.properties或application.yml中配置Redis服务器的地址、端口等信息。spring: redis: host: localhost port: 63793. 使用Redis布隆过滤器由于Spring Data Redis本身不直接支持布隆过滤器，你需要使用Redis命令通过execute方法直接调用。这里我们可以创建一个服务类，用于封装布隆过滤器的操作。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; import java.util.Collections; @Service public class BloomFilterService { @Autowired private RedisTemplate<String, String> redisTemplate; // 添加元素到布隆过滤器 public Boolean addToBloomFilter(String filterName, String value) { String script = "return redis.call('BF.ADD', KEYS[1], ARGV[1])"; return redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Collections.singletonList(filterName), value) == 1L; } // 检查元素是否可能存在于布隆过滤器中 public Boolean checkBloomFilter(String filterName, String value) { String script = "return redis.call('BF.EXISTS', KEYS[1], ARGV[1])"; return redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class), Collections.singletonList(filterName), value) == 1L; } }注意，上述示例使用了Redis的BF.ADD和BF.EXISTS命令，这些命令需要Redis服务器安装了RedisBloom模块。4. 使用示例现在，你可以在你的业务代码中调用BloomFilterService的方法来添加元素到布隆过滤器或者检查元素是否可能存在。@Autowired private BloomFilterServ…

【Redis】单机、主从、哨兵集群搭建
type: item
date: 2024-01-09T09:18:25+08:00
description: Redis集群本章是基于CentOS7下的Redis集群教程，包括：单机安装RedisRedis主从Redis分片集群1.单机安装Redis首先需要安装Redis所需要的依赖：yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录：例如，我放到了/tmp目录：解压缩：tar -xvf redis-6.2.9.tar.gz解压后：进入redis目录：cd redis-6.2.9运行编译命令：make && make install如果没有出错，应该就安装成功了。然后修改redis.conf文件中的一些配置：# 绑定地址，默认是127.0.0.1，会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问 bind 0.0.0.0 # 数据库数量，设置为1 databases 1启动Redis：redis-server redis.conf停止redis服务：redis-cli shutdown2.Redis主从集群2.1.集群结构我们搭建的主从集群结构如图：共包含三个节点，一个主节点，两个从节点。这里我们会在同一台虚拟机中开启3个redis实例，模拟主从集群，信息如下：IPPORT角色172.100.xxx.xxx7001master172.100.xxx.xxx7002slave172.100.xxx.xxx7003slave2.2.准备实例和配置要在同一台虚拟机开启3个实例，必须准备三份不同的配置文件和目录，配置文件所在目录也就是工作目录。1）创建目录我们创建三个文件夹，名字分别叫7001、7002、7003：# 进入/tmp目录 cd /tmp # 创建目录 mkdir 7001 7002 7003如图：2）恢复原始配置修改redis-6.2.9/redis.conf文件，将其中的持久化模式改为默认的RDB模式，AOF保持关闭状态。# 开启RDB # save "" save 3600 1 save 300 100 save 60 10000 # 关闭AOF appendonly no3）拷贝配置文件到每个实例目录然后将redis-6.2.9/redis.conf文件拷贝到三个目录中（在/tmp目录执行下列命令）：# 方式一：逐个拷贝 cp redis-6.2.9/redis.conf 7001 cp redis-6.2.9/redis.conf 7002 cp redis-6.2.9/redis.conf 7003 # 方式二：管道组合命令，一键拷贝 echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.9/redis.conf4）修改每个实例的端口、工作目录修改每个文件夹内的配置文件，将端口分别修改为7001、7002、7003，将rdb文件保存位置都修改为自己所在目录（在/tmp目录执行下列命令）：sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/tmp\/7002\//g' 7002/redis.conf sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/tmp\/7003\//g' 7003/redis.conf5）修改每个实例的声明IP虚拟机本身有多个IP，为了避免将来混乱，我们需要在redis.conf文件中指定每一个实例的绑定ip信息，格式如下：# redis实例的声明 IP replica-announce-ip 172.100.xxx.xxx每个目录都要改，我们一键完成修改（在/tmp目录执行下列命令）：# 逐一执行 sed -i '1a replica-announce-ip 172.100.xxx.xxx' 7001/redis.conf sed -i '1a replica-announce-ip 172.100.xxx.xxx' 7002/redis.conf sed -i '1a replica-announce-ip 172.100.xxx.xxx' 7003/redis.conf # 或者一键修改 printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 172.100.xxx.xxx' {}/redis.conf2.3.启动为了方便查看日志，我们打开3个ssh窗口，分别启动3个redis实例，启动命令：# 第1个 redis-server 7001/redis.con…

【Redis】分布式缓存
type: item
date: 2024-01-02T15:38:00+08:00
description: 分布式缓存-- 基于Redis集群解决单机Redis存在的问题单机的Redis存在四大问题：0.学习目标1.Redis持久化Redis有两种持久化方案：RDB持久化AOF持久化1.1.RDB持久化RDB全称Redis Database Backup file（Redis数据备份文件），也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后，从磁盘读取快照文件，恢复数据。快照文件称为RDB文件，默认是保存在当前运行目录。1.1.1.执行时机RDB持久化在四种情况下会执行：执行save命令执行bgsave命令Redis停机时触发RDB条件时1）save命令执行下面的命令，可以立即执行一次RDB：save命令会导致主进程执行RDB，这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。2）bgsave命令下面的命令可以异步执行RDB：这个命令执行后会开启独立进程完成RDB，主进程可以持续处理用户请求，不受影响。3）停机时Redis停机时会执行一次save命令，实现RDB持久化。4）触发RDB条件Redis内部有触发RDB的机制，可以在redis.conf文件中找到，格式如下：# 900秒内，如果至少有1个key被修改，则执行bgsave ， 如果是save "" 则表示禁用RDB save 900 1 save 300 10 save 60 10000 RDB的其它配置也可以在redis.conf文件中设置：# 是否压缩 ,建议不开启，压缩也会消耗cpu，磁盘的话不值钱 rdbcompression yes # RDB文件名称 dbfilename dump.rdb # 文件保存的路径目录 dir ./ 1.1.2.RDB原理bgsave开始时会fork主进程得到子进程，子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。fork采用的是copy-on-write技术：当主进程执行读操作时，访问共享内存；当主进程执行写操作时，则会拷贝一份数据，执行写操作。1.1.3.小结RDB方式bgsave的基本流程？fork主进程得到一个子进程，共享内存空间子进程读取内存数据并写入新的RDB文件用新RDB文件替换旧的RDB文件RDB会在什么时候执行？save 60 1000代表什么含义？默认是服务停止时代表60秒内至少执行1000次修改则触发RDBRDB的缺点？RDB执行间隔时间长，两次RDB之间写入数据有丢失的风险fork子进程、压缩、写出RDB文件都比较耗时1.2.AOF持久化1.2.1.AOF原理AOF全称为Append Only File（追加文件）。Redis处理的每一个写命令都会记录在AOF文件，可以看做是命令日志文件。1.2.2.AOF配置AOF默认是关闭的，需要修改redis.conf配置文件来开启AOF：# 是否开启AOF功能，默认是no appendonly yes # AOF文件的名称 appendfilename "appendonly.aof"AOF的命令记录的频率也可以通过redis.conf文件来配：# 表示每执行一次写命令，立即记录到AOF文件 appendfsync always # 写命令执行完先放入AOF缓冲区，然后表示每隔1秒将缓冲区数据写到AOF文件，是默认方案 appendfsync everysec # 写命令执行完先放入AOF缓冲区，由操作系统决定何时将缓冲区内容写回磁盘 appendfsync no三种策略对比：1.2.3.AOF文件重写因为是记录命令，AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作，但只有最后一次写操作才有意义。通过执行bgrewriteaof命令，可以让AOF文件执行重写功能，用最少的命令达到相同效果。如图，AOF原本有三个命令，但是set num 123 和 set num 666都是对num的操作，第二次会覆盖第一次的值，因此第一个命令记录下来没有意义。所以重写命令后，AOF文件内容就是：mset name jack num 666Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置：# AOF文件比上次文件 增长超过多少百分比则触发重写 auto-aof-rewrite-percentage 100 # AOF文件体积最小多大以上才触发重写 auto-aof-rewrite-min-size 64mb 1.3.RDB与AOF对比RDB和AOF各有自己的优缺点，如果对数据安全性要求较高，在实际开发中往往会结合两者来使用。2.Redis主从2.1.搭建主从架构单节点Redis的并发能力是有上限的，要进一步提高Redis的并发能力，就需要搭…

【Redis】哨兵集群搭建一键启动和暂停
type: item
date: 2023-11-09T18:16:00+08:00
description: 节点信息先看一下当前路径信息[root@localhost sentinelRedis]# ll 总用量 8 drwxr-xr-x 2 root root 40 11月 9 17:48 7001 drwxr-xr-x 2 root root 40 11月 9 17:48 7002 drwxr-xr-x 2 root root 24 11月 3 13:21 7003 drwxrwxr-x 7 root root 4096 11月 3 11:44 redis-6.2.9 -rwxr-xr-x 1 root root 2656 11月 9 17:53 redis_sentinel.sh drwxr-xr-x 2 root root 79 11月 3 13:21 s1 drwxr-xr-x 2 root root 53 11月 3 13:21 s2 drwxr-xr-x 2 root root 53 11月 3 13:21 s3共包含三个节点，一个主节点，两个从节点。IPPORT角色172.100.xxx.xxx7001master172.100.xxx.xxx7002slave172.100.xxx.xxx7003slave分别有设置密码都是:123456在路径/usr/local/sentinelRedis中打开3个ssh窗口，分别启动3个redis实例，启动命令：# 第1个 redis-server 7001/redis.conf # 第2个 redis-server 7002/redis.conf # 第3个 redis-server 7003/redis.conf停止printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -a 123456 -p {} shutdown三个sentinel实例信息如下：节点IPPORTs1172.100.xxx.xxx27001s2172.100.xxx.xxx27002s3172.100.xxx.xxx27003在路径/usr/local/sentinelRedis中打开3个ssh窗口，分别启动3个redis实例，启动命令：# 第1个 redis-sentinel s1/sentinel.conf # 第2个 redis-sentinel s2/sentinel.conf # 第3个 redis-sentinel s3/sentinel.conf快捷启动和停止脚本脚本位置：/usr/local/sentinelRedis/redis_sentinel.sh#!/bin/bash # 环境变量用于存储密码 export REDIS_PASSWORD="123456" export HOST="172.100.xxx.xxx" # 检查 Redis 和 Sentinel 实例的状态 check_status() { # 检查 Redis 实例状态 redis-cli -p 7001 ping > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Redis 实例 7001 正常运行。" else echo "Redis 实例 7001 未运行。" fi redis-cli -p 7002 ping > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Redis 实例 7002 正常运行。" else echo "Redis 实例 7002 未运行。" fi redis-cli -p 7003 ping > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Redis 实例 7003 正常运行。" else echo "Redis 实例 7003 未运行。" fi # 检查 Sentinel 实例状态 redis-cli -p 27001 ping > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Sentinel 实例 27001 正常运行。" else echo "Sentinel 实例 27001 未运行。" fi redis-cli -p 27002 ping > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Sentinel 实例 27002 正常运行。" else echo "Sentinel 实例 27002 未运行。" fi redis-cli -p 27003 ping > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "Sentinel 实例 27003 正常运行。" else echo "Sent…

【Redis】SpringBoot项目Redis哨兵集群和单节点自适应
type: item
date: 2023-11-09T16:42:00+08:00
description: 介绍：配置文件中可根据是否配置了哨兵模式，如果配置了则按照哨兵模式运行，如果没有配置哨兵模式，则按照单机模式运行。一、引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${redis.version}</version> </dependency>二、配置文件spring: redis: host: 172.100.xxx.xxx #单机模式，哨兵模式可不配置 port: 6379 #单机模式，哨兵模式可不配置 password: xxxx timeout: 10000 database: 2 lettuce: pool: max-active: 180 #连接池最大连接数（使用负值表示没有限制） max-idle: 10 #连接池中的最大空闲连接 max-wait: 1500 #连接池最大阻塞等待时间（使用负值表示没有限制） # 哨兵模式，单机模式不要配置(配置文件中可根据是否配置了哨兵模式，如果配置了则按照哨兵模式运行，如果没有配置哨兵模式，则按照单机模式运行) sentinel: master: mymaster nodes: 172.100.xxx.xxx:27001,172.100.xxx.xxx:27002,172.100.xxx.xxx:27003三、配置类import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisNode; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; import java.time.Duration; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @Configuration @En…

【Redis】核心概念
type: item
date: 2023-03-08T09:47:00+08:00
description: 1、每种数据类型的应用场景String这个其实没啥好说的，最常规的set/get操作，value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。hash这里value存放的是结构化的对象，比较方便的就是操作其中的某个字段。在做单点登录的时候，就是用这种数据结构存储用户信息，以cookieId作为key，设置30分钟为缓存过期时间，能很好的模拟出类似session的效果。list使用List的数据结构，可以做简单的消息队列的功能。另外还有一个就是，可以利用lrange命令，做基于redis的分页功能，性能极佳，用户体验好。set因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重？因为我们的系统一般都是集群部署，使用JVM自带的Set，比较麻烦，难道为了一个做一个全局去重，再起一个公共服务，太麻烦了。另外，就是利用交集、并集、差集等操作，可以计算共同喜好，全部的喜好，自己独有的喜好等功能。sorted setsorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用，取TOP N操作。2、过期策略及内存淘汰机制分析:如果你的redis只能存5G数据，可是你写了10G，那会删5G的数据。怎么删的？还有，你的数据已经设置了过期时间，但是时间到了，内存占用率还是比较高，怎么办?回答:redis采用的是定期删除+惰性删除策略。为什么不用定时删除策略?定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放，但是十分消耗CPU资源。在大并发请求下，CPU要将时间应用在处理请求，而不是删除key,因此没有采用这一策略.定期删除+惰性删除是如何工作的呢?定期删除，redis默认每个100ms检查，是否有过期的key,有过期key则删除。需要说明的是，redis不是每个100ms将所有的key检查一次，而是随机抽取进行检查(如果每隔100ms,全部key进行检查，redis岂不是卡死)。因此，如果只采用定期删除策略，会导致很多key到时间没有删除。于是，惰性删除派上用场。也就是说在你获取某个key的时候，redis会检查一下，这个key如果设置了过期时间那么是否过期了？如果过期了此时就会删除。采用定期删除+惰性删除就没其他问题了么?不管是定期删除还是惰性删除，都是一种不完全精确的删除策略，始终还是会存在已经过期的key无法被删除的场景。而且这两种过期策略都是只针对设置了过期时间的key，不适用于没有设置过期时间的key的淘汰，所以，Redis还提供了内存淘汰策略，用来筛选淘汰指定的key。3、Redis 的存储原理3.1 存储结构Redis 的存储方式使用的是散列表的形式，我们都知道，数据结构的最底层物理结构只有数组和链表，而其他的比如说队列、树、图等数据结构都是基于这两个物理结构所实现的逻辑数据结构。而数组和链表的区别主要在于读写的时间复杂度和内存的拓容上，因为数组要拓容的成本很高，因此大多数情况下会选用链表来实现各种逻辑数据结构。在 Redis 的底层存储中，会维护一个全局的哈希表（本质上就是数组），它有无数个哈希桶（数组元素）组成，每一个哈希桶的存储了两个指针，一个是指向 key 的指针，另一个则是指向 value 的指针。目前 Redis 的 key 只有一种形式，就是字符串，而 value 却有多种支撑，包括 字符串类型，列表，哈希，集合，有序集合。我们知道数组取下标元素的时间复杂度为 O(1), 因为想要获得获取对应的哈希桶，实际上消耗的时间是哈希函数的计算，这个计算和哈希桶的数据量是没有关系的，一般来说哈希函数对应的时间复杂度为 O(1)。这种设计十分的巧妙，把资源放在其他地方，只保留对应资源的指针，在维护上会有很大的便捷性，这就好比说，我不需要把货物都放在房子里，我只需要一张纸，记录着我的每个货物的位置即可。这相当于MySQL 的表结构和数据分开存储有异曲同工之处。3.2 rehash学过数据结构的同学都知道，没有一个绝对无敌的哈希函数可以实现无冲突处理，而一般来说解决冲突的方式有两大类（注意这里是分的大类），一个是开放地址法，另一个是链地址法。而 Redis 采用的正是第二种方式。当存在冲突的时候，会将对应的冲突实体放在一起搞成一个链表，此时哈希桶的指针会增加一个next 指针，用来指向下一个冲突实体，当数据量足够大的时候，这个链表可能会被拉的越来越长，因为链表的查询只能从头结点开始遍历下去，也就是 O(n) 的复杂度(n为链表长度),所以当链表过长时，会影响最终的查询速度。所以这时候不能袖手旁观。因此，在这种情况下，Redis 会有另外一个线程专门去处理。我们称这种方式为 rehash ，和很多语言的数…

【知识总结】SSM配置Redis
type: item
date: 2022-11-10T10:30:00+08:00
description: 实践周老师教ssm，想要在其中整合redis做缓存，但是之前都是使用的springBoot，所以在这里记录一下整合的过程1. 首先在pom.xml中添加相关的依赖： <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.10.1</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.1.8.RELEASE</version> </dependency>2. 然后在resources目录下创建redis.properties文件#redis.host=192.168.2.200 redis.host=127.0.0.1 redis.port=6379 redis.password=123456 redis.maxIdle=300 redis.minIdle=10 redis.maxWaitMillis=1000 redis.maxTotal=500 redis.testOnBorrow=true redis.testOnReturn=true redis.testWhileIdle=true redis.blockWhenExhausted=false redis.numTestsPerEvictionRun=1024 redis.timeBetweenEvictionRunsMillis=30000 redis.minEvictableIdleTimeMillis=1800000上述各种配置除了前四个为必需之外，其他的参数可以根据需要设置。3. application-redis.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis.maxIdle}"></property> <property name="minIdle" value="${redis.minIdle}"></property> <property name="maxTotal" value="${redis.maxTotal}"></property> <property name="maxWaitMillis" value="${redis.maxWaitMillis}"></property> <property name="testOnBorrow" value="${redis.testOnBorrow}"></property> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:hostName="${redis.host}" p:port="${redis.port}" p:password…

【Docker】docker启动redis简单方法
type: item
date: 2022-08-23T08:58:00+08:00
description: 1、拉取redis镜像Redis的版本选择与安装 在Redis的版本计划中，版本号第二位为奇数，为非稳定版本，如2.7、2.9、3.1；版本号第二为偶数，为稳定版本如2.6、2.8、3.0；一般来说当前奇数版本是下一个稳定版本的开发版本，如2.9是3.0的开发版本。建议去https://hub.docker.com/找到当前Redis版本的最新稳定版本。docker pull redis2、在本地某个位置创建以下内容建议将以下内容放在一起，方便以后管理和查看# 以/docker/redis为例 mkdir -p /docker/redis mkdir -p /docker/redis/data touch /docker/redis/redis.conf touch /docker/redis/redis.bash3、编辑配置文件 vim /docker/redis/redis.conf# Redis配置文件 # Redis默认不是以守护进程的方式运行，可以通过该配置项修改，使用yes启用守护进程 daemonize no # 指定Redis监听端口，默认端口为6379 port 6379 # 绑定的主机地址，不要绑定容器的本地127.0.0.1地址，因为这样就无法在容器外部访问 bind 0.0.0.0 #需要密码则打开 requirepass 123123 # 持久化 appendonly yes4、编辑 vim /docker/redis/redis.bashdocker run -p 6379:6379 --name redis -v /docker/redis/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf 解释以上命令docker run redis # 从redis镜像运行容器 -p 6379:6379 # 映射本地6379端口到容器6379端口，前为本地端口 --name redis # 设置容器名称为redis，方便以后使用docker ps进行管理 -v /docker/redis/redis.conf:/etc/redis/redis.conf # 关联本地/docker/redis/redis.conf文件到容器中/etc/redis/redis.conf，同样，前为本地 -v /docker/redis/data:/data # 关联本地/docker/redis/data到容器内/data目录，此为存放redis数据的目录，为方便以后升级redis，而数据可以留存 -d # 后台启动，使用此方式启动，则redis.conf中daemonize必须设置为no，否则会无法启动 redis # 指定要运行的镜像为redis镜像 redis-server /etc/redis/redis.conf # 传递给Redis镜像的命令，在容器内部执行该命令以启动Redis服务器并使用指定的配置文件5、给予执行权限sudo chmod 777 /docker/redis/redis.bash6、启动 /docker/redis/redis.bash # 查看是否已启动 docker ps # 如果无法启动或者docker ps中无对应内容，将bash中命令复制出来，删除-d参数启动，查看报错信息 # 使用redis-cli或者rdm访问 localhost:6379 # 如需访问容器，可使用 docker exec -it redis bash # 或直接使用redis-cli访问容器内redis docker exec -it redis redis-cli [-a 123123]注意：#出现以下错误则是没有输入密码导致 127.0.0.1:6379> set name "hello" (error) NOAUTH Authentication required. #运行以下命令即可 127.0.0.1:6379> auth "123123"7、下一次启动方法docker restart redis

【Redis】基础知识
type: item
date: 2022-07-29T18:56:00+08:00
description: 课程内容Redis 入门Redis 数据类型Redis 常用命令在 Java 中操作 Redis1. 前言1.1 什么是 RedisRedis 是一个基于内存的 key-value 结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件，它是「Remote Dictionary Service」的首字母缩写，也就是「远程字典服务」。基于内存存储，读写性能高适合存储热点数据（热点商品、资讯、新闻）企业应用广泛1.2 使用 Redis 能做什么数据缓存消息队列注册中心发布订阅2. Redis 入门2.1 Redis 简介Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. 翻译为：Redis 是一个开源的内存中的数据结构存储系统，它可以用作：数据库、缓存和消息中间件。官网：https://redis.ioRedis 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库，官方提供的数据是可以达到 100000+的 QPS（每秒内查询次数）。它存储的 value 类型比较丰富，也被称为结构化的 NoSql 数据库。NoSql（Not Only SQL），不仅仅是 SQL，泛指非关系型数据库。NoSql 数据库并不是要取代关系型数据库，而是关系型数据库的补充。关系型数据库(RDBMS)：MysqlOracleDB2SQLServer非关系型数据库(NoSql)：RedisMongo dbMemCached2.2 Redis 下载与安装2.2.1 Redis 下载Redis 安装包分为 windows 版和 Linux 版：Windows 版下载地址：https://github.com/microsoftarchive/redis/releasesLinux 版下载地址： https://download.redis.io/releases/下载后得到下面安装包：2.2.2 Redis 安装1）在 Linux 中安装 Redis在 Linux 系统安装 Redis 步骤：将 Redis 安装包上传到 Linux解压安装包，命令：tar -zxvf redis-4.0.0.tar.gz -C /usr/local安装 Redis 的依赖环境 gcc，命令：yum install gcc-c++进入/usr/local/redis-4.0.0，进行编译，命令：make进入 redis 的 src 目录进行安装，命令：make install安装后重点文件说明：/usr/local/redis-4.0.0/src/redis-server：Redis 服务启动脚本/usr/local/redis-4.0.0/src/redis-cli：Redis 客户端脚本/usr/local/redis-4.0.0/redis.conf：Redis 配置文件2）在 Windows 中安装 RedisRedis 的 Windows 版属于绿色软件，直接解压即可使用，解压后目录结构如下：2.3 Redis 服务启动与停止1）Linux 系统中启动和停止 Redis执行 Redis 服务启动脚本文件redis-server：通过启动日志可以看到，Redis 默认端口号为6379。Ctrl + C停止 Redis 服务通过redis-cli可以连接到本地的 Redis 服务，默认情况下不需要认证即可连接成功。退出客户端可以输入exit或者quit命令。2）Windows 系统中启动和停止 RedisWindows 系统中启动 Redis，直接双击 redis-server.exe 即可启动 Redis 服务，redis 服务默认端口号为 6379Ctrl + C停止 Redis 服务双击redis-cli.exe即可启动 Redis 客户端，默认连接的是本地的 Redis 服务，而且不需要认证即可连接成功。退出客户端可以输入exit或者quit命令。2.4 Redis 配置文件前面我们已经启动了 Redis 服务，默认情况下 Redis 启动后是在前台运行，而且客户端不需要密码就可以连接到 Redis 服务。如果我们希望 Redis 服务启动后是在后台运行，同时希望客户端认证通过后才能连接到 Redis 服务，应该如果做呢？此时就需要修改 Redis 的配置文件：Linux 系统中 Redis 配置文件：REDIS_HOME/redis.confWindows 系统中 Redis 配置文件：REDIS_HOME/redis.windows.conf通过修改…