目录
前言:
本篇主要讲述了Redis的介绍与命令与安装,以及在java中如何使用Redis
1.Redis的介绍:
1.1.Redis(Remote Dictionary Server)是一款高性能的开源内存数据库,常被用作缓存、消息中间件、实时数据处理等场景。它以键值存储为核心,支持多种数据结构,并具备持久化、高可用、分布式等特性。
1.2.核心特性:
1.2.1.内存存储:
1.数据主要存储在内存中,读写速度极快(可达10万+/秒 QPS),适合高性能场景。
2.通过持久化机制(RDB/AOF)可将内存数据保存到磁盘,防止数据丢失。
1.2.2.丰富的数据结构:Redis不仅支持简单的字符串(String),还提供以下数据结构:
1.Hash:键值对的集合,适合存储对象(如用户信息)。
2. List:有序元素列表,支持双向操作,可用于消息队列。
3.Set:无序唯一元素集合,适合去重和集合运算(交集、并集)。
4.Sorted Set:有序集合,通过分数(score)排序,适用于排行榜。
5.Bitmap/HyperLogLog/Stream:扩展功能如位操作、基数统计、流式数据处理。
1.2.3.持久化机制:
1.RDB(快照):定期生成数据快照,适合备份和快速恢复。
2.AOF(追加日志):记录所有写操作命令,数据安全性更高。
1.2.4高可用与扩展:
1.主从复制:支持一主多从架构,从节点同步主节点数据,实现读写分离。
2.哨兵(Sentinel):监控主节点状态,自动故障转移,保障高可用。
3.集群(Cluster):分布式模式,数据分片存储,支持横向扩展。
1.2.5原子性与事务:
1.单线程模型保证命令原子性执行。
2.支持事务(MULTI/EXEC)和Lua脚本,实现复杂操作。
2.Redis的类型与命令:
2.1.Redis的数据类型
2.2.Redis字符串类型命令:
2.3.Redis哈希类型命令:
2.4.Redis列表类型命令:
2.5.Redis集合类型命令:
2.6.Redis有序集合类型命令:
2.7.Redis通用命令:
2.8.总结:
1.在Redis命令使用时返回的是1就代表执行成功,0就是失败
2.在字符串类型命令中set与setnx的区别:set是如果key存在,那么会覆盖之前value(没有就创建,有就不覆盖),而setnx则是key存在,不会覆盖(没有就创建,有就不操作)
3.在字符串类型命令中setex可以设置过期时间(指定30秒,30秒后结束那么Redis就会自动删除该key),所以我们可以想到什么场景 =》验证码(它是会过期的)
4.在哈希类型命令中没有什么注意的,不过哈希的key与field不好记忆,一个简单理解的方法
=》你将key看作Mysql中的table(表),而field就是表中的ID,value就是具体的数据
5.在列表类型命令中要注意一下添加命令lpush:它每次添加数据都是从最左侧添加(先添加a后添加b,那么它们的顺序是:b a)(看作队列)
6.在列表类型命令中怎么使用查询命令lrange:就是指定索引,开始索引和结束索引(结束索引有点不同与java),开始索引(一般写0,索引从0开始的),而结束索引(写-1代表列表的最后一个元素,-2代表倒数第二个元素,依次推)
7.在有序集合类型(不允许重复,分数为double类型)命令中查询命令zrange中可以加一个参数:withscores,加了这个参数会将分数也查询出来,没有就只会查询所有元素
8.在有序集合类型(不允许重复)命令中添加分数命令zincrby:是在原先分数的基础上添加分数(现在=原先+要添加值)
9.在通用命令中keys命令:可以写(keys *)查询所有key ,这样写(keys set*)查询前缀为set的key
10.执行范围的对于命令时,该范围是闭区间
11.Redis默认升序排序
3.Redis的安装:
3.1.Windows版本
3.1.1.关于Windows版本的安装就没有Linux的复杂只需要找到对应的网站下载安装包就行,不过Redis的Windows版本似乎好久没有更新了。
3.1.2.在Redis中没有用户名的概念,只有密码(在Windows版本中是在配置类中更改密码)
在该配置类中找到
将注释解除,requirepass 后面接的就是你的密码(注意:requirepass 前面的空格也要删除)
3.1.3.运行:
1.在安装Redis的所在目录运行cmd
2.输入:redis-server.exe redis.windows.conf
3.效果:
3.2.Linux版本
3.2.1.安装步骤:
3.2.1.准备Linux版本的Redis的tar
3.2.2.首先需要安装Redis所需要的gcc依赖:在Linux中输入命令: yum install -y gcc tcl
3.2.3.然后上传tar包到任意目录
3.2.4.解压缩包:例如:tar -zxvf redis-6.2.6.tar.gz
3.2.5.进入redis目录: cd redis-6.2.6
3.2.6.运行编译命令: make && make install (执行成功就安装成功了)
3.2.2.启动方式:
1..默认的安装路径是在 /usr/local/bin
目录下:具体的文件作用
redis-cli:是redis提供的命令行客户端
redis-server:是redis的服务端启动脚本
redis-sentinel:是redis的哨兵启动脚本
2..redis的启动方式有很多种,例如:
默认启动
指定配置启动
开机自启
3..默认启动:
安装完成后,在任意目录输入redis-server命令即可启动Redis: redis-server
4..指定配置启动:
如果要让Redis以后台
方式启动,则必须修改Redis配置文件,就在我们之前解压的redis安装包下,名字叫redis.conf。
1.先进行备份防止出现错误:cp redis.conf redis.conf.bck
2.执行命令:vi redis.conf (进入文件中修改配置)
3.找到允许访问地址:默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问(按进入编辑然后修改地址,按Esc退出编辑)
4.找到守护进程,修改为yes后即可后台运行:
先退出编辑,然后输入/daemonize即可快速找到对应daemonize(没有找到就按n切换到下一个daemonize)
5.找到密码,设置密码:
先退出编辑,然后输入/requirepass即可快速找到对应requirepass(没有找到就按n切换到下一个requirepass),将注释解除,requirepass 后面接的就是你的密码(注意:requirepass 前面的空格也要删除)
6.设置日志文件:默认为空,不记录日志,可以指定日志文件名,便于查看(本来是空字符串即不记录日志,在双引号里面填写的内容就是日志文件名称)
7.注意:设置了密码:开启服务时需要指定对应密码
5. 开机自启:
首先,新建一个系统服务文件:vi /etc/systemd/system/redis.service
然后填写下列内容:
[Unit]
Description=redis-server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target
然后重载系统服务: systemctl daemon-reload
现在,我们可以用下面这组命令来操作redis了:
# 启动 systemctl start redis
# 停止 systemctl stop redis
# 重启 systemctl restart redis
# 查看状态 systemctl status redis
执行下面的命令,可以让redis开机自启:systemctl enable redis
6.注意:记得开启Linux的防火墙对于端口6379:firewall-cmd --zone=public --add-port=6379/tcp --permanent,然后重新加载:firewall-cmd --reload
4.在java中使用Redis:
4.1.介绍
Redis的java客户端一般经常使用的有:Jedis,Lettuce,Redisson,而Spring已经整合了Jedis,Lettuce ==》Spring Data Redis
Jedis:完全以Redis的命令来作为方法名称,简单实用,但是它的实例是线程不安全的,多线程的环境下需要基于连接池来使用
Lettuce:它是基于Netty实现的,支持同步,异步和响应式编程方式并且线程是安全的,支持Redis的哨兵模式,集群模式,管道模式
Redisson:它基于Redis实现的分布式,可伸缩的java数据结构集合
4.2.Jedis
1.实现:
1.引入依赖:
2.建立连接:
3.实现功能:
4.释放资源:
2.注意:
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能的损失,所以推荐使用Redis的连接池来代替Jedis的直连方式
4.3.Spring Data Redis
1.注意: Spring Data Redis 虽然整合了Jedis,Lettuce,但是默认使用的是Lettuce,如果要使用Jedis那么需要引入它的依赖
2.实现:
1.引入依赖:
2.配置文件:
3.注入RedisTemplate并使用
3.使用RedisTemplate时,Spring默认使用的是JdkSerializationRedisseriallzer序列化器,而它会将要存入Redis的key与value先转变成字节存入(缺点:在Redis中不易阅读全是字节,内存消耗大)
4.两种方案:
方案一:
1.自定义RedisTemplate
2.修改序列化器
3.解释:因为key一般只会使用String类型,而value不确定,那么你可以认为它是一个对象(对象就全部包含了),所以key使用StringRedisSerializer序列化器,value使用GenericJackson2JsonRedisSerializer序列化器
4.注意:因为value使用了对象的序列化器转换器,当你服务器访问Redis数据时,你是不是需要知道这个value对应的类(class字节码),所以存入Redis时value除了存入对象里面的值还会存入对应对象的字节码class类型(为了反序列化时知道对象类型),所以依然也会造成额外的内存损失
方案二:
1.使用SpringRedisTemplate
2.存入Redis时,如果要存入对象,那么手动将对象序列化JSON
3.读取Redis时,如果要读对象,那么手动将JSON反序列化成对象
4.解释:SpringRedisTemplate是Spring提供好的,直接注入就可以使用,并且key与value都是使用的String序列化器,因此需要手动转换对象