一、 准备工作

1.Linux系统
2.安装redis(也可以安装docker,然后再docker中装redis,本文章就直接用Linux安装redis做演示)redis下载地址:http://download.redis.io/releases/redis-4.0.14.tar.gz

二、修改redis,开启远程访问

找到redis中的redis.conf文件并编辑(在安装路径中找到)

vim ./redis.conf

1、找到bind 127.0.0.1并注释掉,默认127.0.0.1只能本地访问,注释掉即可ip访问
2、修改 protected-mode 属性值为no,注释掉并把保护模式禁用以后可以IP访问
3、修改daemonize属性将no 改为yes,将daemonize设置为yes即启动后台运行
4、开放6379端口

/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

默认不对外开放6379

5、启动redis

redis-server /myconf/redis.conf

redis-server默认在/usr/local/bin路径下,redis.conf在redis的安装路径下

6、测试连接

redis-cli -h 192.168.126.129 -p 6379

redis-cli -h redis服务器IP -p 6379 -a 密码(没有设置redis密码不要写空,否则报错)

三、Java代码编写

目录结构

一个user表

代码
pom.xml文件(可以根据自己的需要来添加或修改)

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mybatis 与 spring boot 2.x的整合包 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency><!--mysql JDBC驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency></dependencies>

下面是springboot的配置文件application.yml,配置redis(里面都有注释解释)

server:port: 8081#数据库连接
spring:datasource:url: jdbc:mysql://localhost:3306/mytest_springboot_cache?useUnicode=truedriver-class-name: com.mysql.jdbc.Driverusername: rootpassword: lzh## Redis 配置redis:## Redis数据库索引(默认为0)database: 0## Redis服务器地址host: 192.168.126.129## Redis服务器连接端口port: 6379## Redis服务器连接密码(默认为空)password:jedis:pool:## 连接池最大连接数(使用负值表示没有限制)#spring.redis.pool.max-active=8max-active: 8## 连接池最大阻塞等待时间(使用负值表示没有限制)#spring.redis.pool.max-wait=-1max-wait: -1## 连接池中的最大空闲连接#spring.redis.pool.max-idle=8max-idle: 8## 连接池中的最小空闲连接#spring.redis.pool.min-idle=0min-idle: 0## 连接超时时间(毫秒)timeout: 1200#将themilef的默认缓存禁用,热加载生效thymeleaf:cache: false#mybatis的下划线转驼峰配置configuration:map-underscore-to-camel-case: true#另外一种打印语句的方式log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#打印sql时的语句
logging:level:com:acong:dao: debugfile: d:/logs/bsbdj.log

接着是实体类

package com.lzh.springbootstudytest.bean;import java.io.Serializable;/*** @author lzh* create 2019-09-18-22:32*/
public class User implements Serializable {private static final long serialVersionUID = 1L;private int uid;private String userName;private String passWord;private int salary;public int getUid() {return uid;}public void setUid(int uid) {this.uid = uid;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public User(int uid, String userName, String passWord, int salary) {super();this.uid = uid;this.userName = userName;this.passWord = passWord;this.salary = salary;}public User() {super();}
} 

这是controller类,用于暴露接口访问

package com.lzh.springbootstudytest.controller;import com.lzh.springbootstudytest.bean.User;
import com.lzh.springbootstudytest.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author lzh* create 2019-09-18-22:36*/
@RestController
public class TestController {@Autowiredprivate UserService userService;@RequestMapping("/queryAll")public List<User> queryAll(){List<User> lists = userService.queryAll();return lists;}@RequestMapping("/findUserById")public Map<String, Object> findUserById(@RequestParam int id){User user = userService.findUserById(id);Map<String, Object> result = new HashMap<>();result.put("uid", user.getUid());result.put("uname", user.getUserName());result.put("pass", user.getPassWord());result.put("salary", user.getSalary());return result;}@RequestMapping("/updateUser")public String updateUser(){User user = new User();user.setUid(1);user.setUserName("cat");user.setPassWord("miaomiao");user.setSalary(4000);int result = userService.updateUser(user);if(result != 0){return "update user success";}return "fail";}@RequestMapping("/deleteUserById")public String deleteUserById(@RequestParam int id){int result = userService.deleteUserById(id);if(result != 0){return "delete success";}return "delete fail";}
}

配置redistemplate序列化

package com.lzh.springbootstudytest.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @author lzh* create 2019-09-24-15:07*/
@Configuration
@EnableCaching
public class RedisConfig {@Bean(name = "redisTemplate")public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value的序列化类型return redisTemplate;}
}

接着是Mapper持久层Dao,这里主要用注解写比较方便,也可以使用mybatis的xml配置文件写sql语句

package com.lzh.springbootstudytest.mapper;import com.lzh.springbootstudytest.bean.User;
import org.apache.ibatis.annotations.*;import java.util.List;/*** @author lzh* create 2019-09-18-22:32*/
@Mapper
public interface UserDao {@Select("select * from user")List<User> queryAll();@Select("select * from user where uid = #{id}")User findUserById(int id);@Update("UPDATE USER SET username = CASE WHEN (#{userName} != NULL) AND (#{userName} != '') THEN #{userName},PASSWORD = CASE WHEN (#{passWord} != NULL) AND (#{passWord} != '') THEN #{passWord},salary = CASE WHEN (#{salary} != 0) THEN #{salary} WHERE uid = #{uid}")int updateUser(@Param("user") User user);@Delete("delete from user where uid = #{id}")int deleteUserById(int id);}

service层,这里主要是使用redis模板来写

package com.lzh.springbootstudytest.service;import com.lzh.springbootstudytest.bean.User;
import com.lzh.springbootstudytest.mapper.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.concurrent.TimeUnit;/*** @author lzh* create 2019-09-18-22:33*/
@Service
public class UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate RedisTemplate redisTemplate;public List<User> queryAll() {return userDao.queryAll();}/*** 获取用户策略:先从缓存中获取用户,没有则取数据表中 数据,再将数据写入缓存*/public User findUserById(int id) {String key = "user_" + id;ValueOperations<String, User> operations = redisTemplate.opsForValue();//判断redis中是否有键为key的缓存boolean hasKey = redisTemplate.hasKey(key);if (hasKey) {User user = operations.get(key);System.out.println("从缓存中获得数据:"+user.getUserName());System.out.println("------------------------------------");return user;} else {User user = userDao.findUserById(id);System.out.println("查询数据库获得数据:"+user.getUserName());System.out.println("------------------------------------");// 写入缓存operations.set(key, user, 5, TimeUnit.HOURS);return user;}}/*** 更新用户策略:先更新数据表,成功之后,删除原来的缓存,再更新缓存*/public int updateUser(User user) {ValueOperations<String, User> operations = redisTemplate.opsForValue();int result = userDao.updateUser(user);if (result != 0) {String key = "user_" + user.getUid();boolean haskey = redisTemplate.hasKey(key);if (haskey) {redisTemplate.delete(key);System.out.println("删除缓存中的key-----------> " + key);}// 再将更新后的数据加入缓存User userNew = userDao.findUserById(user.getUid());if (userNew != null) {operations.set(key, userNew, 3, TimeUnit.HOURS);}}return result;}/*** 删除用户策略:删除数据表中数据,然后删除缓存*/public int deleteUserById(int id) {int result = userDao.deleteUserById(id);String key = "user_" + id;if (result != 0) {boolean hasKey = redisTemplate.hasKey(key);if (hasKey) {redisTemplate.delete(key);System.out.println("删除了缓存中的key:" + key);}}return result;}}

这里主要是使用RedisTemplate来对远程redis操作,每次访问controller暴露的接口,首先判断redis缓存中是否存在该数据,若不存在就从数据库中读取数据,然后保存到redis缓存中,当下次访问的时候,就直接从缓存中取出来。这样就不用每次都执行sql语句,能够提高访问速度。 但是在保存数据到缓存中,通过设置键和值和超时删除,注意设置超时删除缓存时间不要太长,否则会给服务器带来压力。

执行spring boot的启动类,访问http://localhost:8081/findUserById?id=1

再次访问http://localhost:8081/findUserById?id=1就是从缓存中获取保存的数据

SpringBoot整合redis缓存(一)相关推荐

  1. SpringBoot整合Redis缓存

    SpringBoot整合Redis缓存 一.缓存概念知识 1.是什么缓存 2.缓存的优缺点 3.为什么使用缓存 二.Redis概念知识 1.Redis简介 2.为什么用Redis作为缓存 3.Redi ...

  2. SpringBoot整合Redis缓存中间件

    首先在pom.xml中引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifac ...

  3. springboot整合redis缓存报错

    一.问题现象 二.解决办法

  4. SpringBoot缓存管理(二) 整合Redis缓存实现

    SpringBoot支持的缓存组件 觅波小说网 https://www.3812.info 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springfr ...

  5. springboot整合redis做缓存

    之前的项目中,用到过redis,主要是使用redis做缓存,redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,得益于redis的读写数据,尤其是在读取数据的时 ...

  6. Springboot整合redis实现缓存及其缓存运行原理浅析

    声明:小白,学习阶段,主要目的是为了记录学习过程,本文仅供参考,如有不足的地方欢迎指出讨论交流 本文基于Springboot2.1.3版本开发: 准备阶段 首先是pom.xml文件所需的依赖: < ...

  7. 8分钟带你学会SpringBoot整合Redis来实现缓存技术

    1.概述 随着互联网技术的发展,对技术要求也越来越高,所以在当期情况下项目的开发中对数据访问的效率也有了很高的要求,所以在项目开发中缓存技术使用的也越来越多,因为它可以极大的提高系统的访问速度,关于缓 ...

  8. SpringBoot整合Redis+Redis缓存应用+Redis实现Session共享+...

    一.SpringBoot整合Redis 1.导入依赖 <!--存在Redis依赖--> <dependency><groupId>org.springframewo ...

  9. Springboot整合redis(lettuce)

    springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...

最新文章

  1. 英特尔详解5G将如何助力VR的未来发展
  2. python添加lxml库_7分钟,建议看完这5个Python库对比丨web抓取
  3. Hadoop wordcount
  4. foreach判断最后一个_PHP 内核:foreach 是如何工作的(二)
  5. LeetCode中常用语言的一些基本方法记录
  6. matplotlib调节colorbar的大小
  7. 面试技巧:16个经典面试问题回答思路(转)
  8. 测试面试题集-MySQL数据库灵魂拷问加强版
  9. Quadtrees UVA - 297
  10. 有关文档流的一些注意事项
  11. python:ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from
  12. David Pozar 微波工程读书笔记(二)
  13. kali linux工具词典,Kali字典神器—Crunch
  14. jQuery-点击按钮插入视频
  15. 第一辆定制款豪华电动汽车Battista Hyper GT揭晓
  16. STM32F103 + STM32CubeMX实现流水灯闪烁
  17. 水星USB无线网卡mw150us苹果macOS系统驱动成功
  18. 『大牛公司机构近期研究报告大合集』第二版
  19. Win10系统的SurfacePro4的触摸笔如何使用
  20. 模式识别(二)特征矢量与空间

热门文章

  1. js中[object,object]是什么,怎么取值
  2. nginx php permanent,Nginx permanent重定向参数问题
  3. JQuary学习之路---初始JQuary
  4. JavaScript:HTML中的UI->标签
  5. 模式,动态,数据化及其他
  6. 华工《计算机应用基础 简答题》,华工《计算机应用基础》随堂练习
  7. jQuery Mobile-页面跳转
  8. 请牢记看小电影前一定要检查一下域名是不是 HTTPS 的,否则……
  9. 对话:与印度第一大IT教育培训公司CEO谈软件
  10. Spring Boot教程(十二)整合elk(1)