09、redis安装入门
1 课程补充
1.1 网络的知识
1.1.1 虚拟机和window的连接
说明:虚拟机的nat模式依赖于net8网卡,nat8网卡的地址是一个网关,在window系统中.window系统访问Linux系统必须经过nat8网卡.否则不能通信
1.1.2 虚拟化关闭
说明:该报错信息是由于计算机关闭了虚拟化设置.需要进入bios系统中开启即可F10保存退出.
1.1.3 数据库链接长时间链接不上
说明:1.关闭防火墙
2.开放mysql对外的访问权限
3.ping 主机IP地址是否成功
4.将nat8网卡重启
5.安装mysql开始
6.保证mysql数据的一致性
2 Redis
2.1 Redis介绍
2.1.1 分析
说明:数据库中虽然实现了主从复制和读写分离.在一定程度上能够抗击高并发,但是性能并不是特别的完善.现在所面临的主要问题是用户大量的读的操作所引发的高并发的问题?
如何处理:缓存机制
2.1.2 缓存机制
说明:缓存机制是降低了客户端访问服务器的访问频次.并且缓存中的数据是与服务器(数据库)中的数据是同步的.
2.1.3 引入缓存引发的问题
1.缓存的数据如何存储??
2.缓存中的数据如何持久化??
3.缓存中的数据如何实现数据同步??
4.缓存中的数据内存如何维护
2.1.4 解决方案
1.缓存中的数据可以使用Map存储,
因为map的数据结构是key:value. key不允许重复
2.定时将缓存中的数据保存到磁盘文件中.当服务器宕机,先应该读取磁盘持久化文件,恢复缓存的数据.
3.当数据发生”更新”操作时,及时的维护缓存的数据(拦截器/监听器/AOP)
4.设定最大的内存,当内存超过阈值时,采用lru算法删除最近最少使用的数据
2.1.5 Redis介绍
说明:redis是现阶段使用量较多的缓存数据库.能够支持300000/秒集合运算.因为底层是基于c语言开发的.
2.1.6 Redis下载
2.2 安装redis
2.2.1 引入jar包
2.2.2 编译redis
说明:如果出现上述文件表示编译成功
-
redis-server 表示启动redis
-
redis-cli 连接redis的客户端
-
redis-check-rdb 检测数据持久化文件 rdb
-
redis-check-aof 检测redis持久化文件aof
2.2.3 安装redis
说明:如果出现上图的提示,表示redis安装成功
2.2.4 Redis启动
说明:启动的命令 redis-server
2.2.5 开启redis的后台启动
- 编辑配置文件
vim redis.conf
- 取消IP绑定
- 关闭保护模式
4.开启后台启动
- 启动测试
redis-server redis.conf
5.关闭redis
Kill -9 9249
redis-cli shutdown
2.2.6 Redis客户端测试
命令:redis-cli 进入客户端
2.2.7 Redis命令
说明:学习redis命令
指令 |
说明 |
案例 |
set |
设定key的值 |
set name tom |
get |
获取指定 key 的值 |
get name |
strlen |
获取key值的长度 |
strlen name |
exists |
检查给定 key 是否存在 |
exists name 返回1存在 0不存在 |
del |
删除指定的key/key1 key2 |
del name1 name2 |
keys |
命令用于查找所有符合给定模式 pattern 的 key |
Keys * 查询全部的key值 Keys n?me 占位符 Keys name* 以name开头的key |
mset |
赋值多个key-value |
mset key1 value1 key2 value2 key3 value3 同时赋值多个值 |
mget |
获取多个key |
Mget key1 key2 key3 |
append |
对指定的key进行追加 |
append key 123456 value123456 append key " 123456" value 123456中间多一个空格 |
Type |
查看key的类型 |
Type key1 127.0.0.1:6379> TYPE key1string |
Flushdb |
清空当前数据库 |
Flushdb 清空数据库 |
Select |
切换数据库 |
Select 0-15 redis一共有16个数据库 |
FLUSHALL |
清空全部数据库数据 |
flushall |
Incr |
自动增长1 |
Incr num 数据会自动加1 Incr string 数据库会报错 |
Decr |
自动减1 |
Decr name 数据会自动减1 |
incrby |
指定步长自增 |
Incrby 2 每次自增2 |
Decrby |
指定步长自减 |
Decrby 2每次减2 |
Expire |
指定key的失效时间单位是秒(s) |
EXPIRE name1 5 5秒后数据失效 |
Ttl |
查看key的剩余存活时间 |
Ttl name -2表示失效 -1没有失效时间 |
Pexpire |
设置失效时间(毫秒) |
Pexpire name 1000 用于秒杀业务 |
Persist |
撤销失效时间 |
撤销失效时间 |
2.3 Redis入门案例
2.3.1 引入jar包文件
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.1.RELEASE</version> </dependency> <jedis.version>2.6.2</jedis.version> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency>
2.3.2 入门案例
/** * 1.连接远程redis的客户端 ip:6379 * 2.通过jedis操作数据的增和删 */ @Test public void test01(){ Jedis jedis = new Jedis("192.168.126.142", 6379); jedis.set("name", "jerry"); System.out.println("获取redis中的数据:"+jedis.get("name")); }
2.4 Spring管理jedis
2.4.1 编辑配置文件
<!--Spring管理Jedis name= "构造参数的名称" index="构造参数的位置" 总结:构造注入时使用index不用name.原因由于java只会维护形参的数据类型 不会维护形参的名称.所有通过name属性进行构造注入时,可能会产生风险. 所以建议使用index. addUser(int age,String sex) addUser(int arg0,String arg1) 由于没有导入源码 关于type类型的说明: 一般情况下,SPring会自动的维护参数类型,所以可以省略不写. 但是如果类中的构造方法重载较多,出现参数个数相同的情况, 需要指定参数类型.Spring根据特定的参数实现构造注入. --> <bean id="jedis" class="redis.clients.jedis.Jedis"> <constructor-arg index="0" value="${redis.host}" type="java.lang.String"/> <constructor-arg index="1" value="${redis.port}" type="int"/> </bean>
2.4.2 引入redis的配置文件
1.编辑redis.properties
2.交给Spring容器管理
2.5 Redis缓存实例
2.5.1 使用缓存的要求
说明:将变化不大的数据添加到缓存中.
省市县区,部门名称/信息/商品的分类目录
2.5.2 商品分类目录实现缓存
说明:商品分类目录使用redis缓存实现
规定:
- key值使用parentId
- value值使用List集合的JSON串
步骤:
1.当用户查询数据时,先查询缓存
2.当缓存中没有数据,应该查询后台的数据库
3.将查询的结果转化为JSON串,存入redis中
4.当用户再次查询时,缓存中已经含有该数据
5.将redis中的JSON串转化为List集合
6.将list集合返回
2.5.3 编辑Controller
2.5.4 编辑Service

/** * 1.当用户查询数据时,先查询缓存 2.当缓存中没有数据,应该查询后台的数据库 3.将查询的结果转化为JSON串,存入redis中 4.当用户再次查询时,缓存中已经含有该数据 5.将redis中的JSON串转化为List集合 6.将list集合返回 */ @Override public List<ItemCat> findItemCatByParentId(Long parentId) { //创建List集合 List<ItemCat> itemCatList = new ArrayList<ItemCat>(); //定义key 定义前缀保证key不重复 String key = "ITEM_CAT_"+parentId; //从缓存中获取数据 String jsonData = jedis.get(key); try { //判断返回值是否为空 if(StringUtils.isEmpty(jsonData)){ //表示没有缓存 查询数据库 ItemCat itemCat = new ItemCat(); itemCat.setParentId(parentId); itemCat.setStatus(1); //正常的分类信息 itemCatList = itemCatMapper.select(itemCat); //将itemcatList集合转化为JSON串 String resultJSON = objectMapper.writeValueAsString(itemCatList); //将数据存入redis缓存中 jedis.set(key, resultJSON); }else{ //表示redis中含有数据,将JSON数据转化为List集合 ItemCat[] itemCats = objectMapper.readValue(jsonData,ItemCat[].class); //将返回值转化为List集合 itemCatList = Arrays.asList(itemCats); } } catch (Exception e) { e.printStackTrace(); } return itemCatList; }
2.5.5 编辑pojo
说明:如果不添加上述的注解则会报错
说明:由于将JSON数据转化为对象时,需要调用其中的setXXX()方法.但是state和text属性是树形结构展现数据时的要求和实际的业务没有关系.所以添加@JsonIgnoreProperties(ignoreUnknown=true)表示忽略未知字段.最终实现对象的转化.
2.5.6 速度测试
- 使用redis缓存前
没有使用redis缓存前耗时400毫秒
- 使用redis缓存后
速度明显提升
2.5.7 修改
1.修改数据文件
2.修改nginx配置文件
2.6 Redis单台高级编辑
2.6.1 定义配置文件

<!--通过线程池的方式整合单台redis --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--定义连接的总数 --> <property name="maxTotal" value="${redis.maxTotal}"/> <!--定义最大的空闲数量 --> <property name="maxIdle" value="${redis.maxIdle}"/> <!--定义最小空闲数量 --> <property name="minIdle" value="${redis.minIdle}"></property> </bean> <!--通过工厂模式创建jedis连接 需要指定 host主机 和端口号 引用连接池配置 --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.host}"/> <property name="port" value="${redis.port}"/> <!--引入线程池的配置 --> <property name="poolConfig" ref="poolConfig"/> </bean> <!--配置SpringJedisTemplate spring操作redis的模板工具API --> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <!--配置redis工厂 --> <property name="connectionFactory" ref="jedisConnectionFactory"></property> </bean>
2.6.2 引入redis.properties文件
redis.host=192.168.126.142
redis.port=6379
redis.maxTotal=1000
redis.maxIdle=30
redis.minIdle=10
2.6.3 编辑工具类

@Service public class RedisService { @Autowired //注入spring的模板工具 private StringRedisTemplate redisTemplate; public void set(String key,String value){ ValueOperations<String, String> operations = redisTemplate.opsForValue(); //将数据写入redis中 operations.set(key, value); } //通过key获取数据 public String get(String key){ ValueOperations<String, String> operations = redisTemplate.opsForValue(); return operations.get(key); } }
说明:将jt-common编辑完成之后需要重新进行打包,否则业务层调用不生效
2.6.4 编辑service
说明:将原有单个jedis的操作改为jedis连接池的形式.性能更好,更加适用于企业开发.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步