第12章—整合Redis
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html
码云源码地址:https://gitee.com/jinxiaohang/springboot
一、介绍
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 优势:
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
二、本地安装Redis
Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定。
详情请参考:http://redis.io/download
Redis官方是不支持windows的,但在 GitHub上开发了一个Win64的版本。
项目地址是:https://github.com/MicrosoftArchive/redis/releases
1、下载解压,在解压后的bin目录下有以下这些文件:
redis-benchmark.exe #基准测试
redis-check-aof.exe # aof
redis-check-dump.exe # dump
redis-cli.exe # 客户端
redis-server.exe # 服务器
redis.windows.conf # 配置文件
。。。
2、打开 redis-server.exe # 服务器 即可开启服务。【需要用Administrator用户运行,如果不是管理员账户就会出各种问题,服务安装以后启动不了等等问题,应该可以修改服务的属性–>登录用户等选项来修正.】
3、双击打开 redis-cli.exe , 如果不报错,则连接上了本地服务器
4、推荐一款可视化工具:RedisStudio
Redis安装没有问题时就可以进入下面的步骤。
三、添加依赖
如果是新建项目的,可以在这页添加依赖:
原有项目只需添加一下架包:
<!--添加缓存支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--添加Redis缓存支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
四、添加配置
在application.yml增加Redis的配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver jpa:
hibernate:
ddl-auto: update
show-sql: true redis:
# 使用的数据库(0-15),默认为0
database: 0
# Redis服务器连接密码(默认为空
password:
# Redis服务器连接端口
port: 6379
# Redis服务器地址
host: 127.0.0.1
五、Java 使用 Redis
添加RedisUtil类。(只是将Redis当作普通数据库实现基本操作)
public class RedisUtil { /**
* 连接到 redis 服务
*/
public static void connectRedis() {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
} /**
*Redis Java String(字符串) 实例
*/
public static void useString(){
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//设置 redis 字符串数据
jedis.set("xiaohang", "123456");
// 获取存储的数据并输出
System.out.println("redis 存储的字符串为: "+ jedis.get("xiaohang"));
} /**
* Redis Java List(列表) 实例
*/
public static void useList(){
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//存储数据到列表中
jedis.lpush("site-list", "Baidu");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
} /**
* Redis Java Keys 实例
*/
public static void useKeys(){
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功"); // 获取数据并输出
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
}
}
六、运用Redis的缓存
1、让SpringBoot内置的缓存框架使用我们的Redis作为新的缓存,我们来添加一个RedisConfig的配置类。
添加RedisConfig类实现Redis配置。
@Configuration
@EnableCaching
public class RedisConfig { @Bean
public CacheManager cacheManager(RedisTemplate redisTemplate){
return new RedisCacheManager(redisTemplate);
}
}
@EnableCaching注解来开启我们的项目支持缓存,我们在配置类内添加了方法cacheManager(),方法的返回值则是使用了我们的Redis缓存的管理器,SpringBoot项目启动时就会去找自定义配置的CacheManager对象并且自动应用到项目中。
2、编写各层代码,方式与以往一样,引用代码:https://gitee.com/jinxiaohang/springboot/tree/master/springboot-jpa
3、修改serviceimpl层,实现缓存(注解方式)
@Service
@CacheConfig(cacheNames = "user")//新添加
public class UserServiceImpl implements UserService {
@Autowired
private UserInfoRepository userInfoRepository; @Cacheable//新添加
@Override
public List<UserInfo> list() {
return userInfoRepository.findAll();
} @Override
public UserInfo getOne(String userId) {
return userInfoRepository.findOne(userId);
} @Override
public UserInfo save(UserInfo user) {
return userInfoRepository.save(user);
} @Override
public UserInfo update(UserInfo user) {
return userInfoRepository.save(user);
} @Override
public boolean delete(String userId) {
userInfoRepository.delete(userId);
return true;
}
}
4、异常处理(如果没有可跳过)
如果按照上面的代码运行会出现NotSerializableException异常,需要让实体类继承实现Serializable接口。
@Data
@Entity
public class UserInfo implements Serializable{
@Id
private String userId;
private String userName;
private String password; @Override
public String toString() {
return "{ \"userId\" : \""+userId
+"\", \"userName\" : \""+userName
+"\", \"password\" : \""+password
+"\" }";
}
}
5、运行测试
先将serviceimpl层的@Cacheable注解注释了,运行程序,连续访问接口3次,控制台内容如下:
再将注释删除了,运行程序,连续访问接口3次,控制台内容如下:
第一次访问的结果缓存下来了,并持久化到Redis数据库中,下次访问就先访问缓存,如果存在就不会访问mysql数据库。如果mysql数据库中的信息被修改了,缓存中的数据记得更新。
本次主要实现整合Redis,对于Redis的使用没有更深入的研究,今天展示的使用可能不够规范。
七、Redis命令
Redis数据库内有很多个命令下面我简单介绍几个大家在日常开发中常用到的。
flushdb:清空当前数据库。
select [index]:选择索引数据库,index为索引值名,如:select 1。
del [key]:删除一条指定key的值。
keys *:查看数据库内所有的key。
flushall:清空所有数据库。
quit:退出客户端连接。
第12章—整合Redis的更多相关文章
- SpringBoot进阶教程(二十七)整合Redis之分布式锁
在之前的一篇文章(<Java分布式锁,搞懂分布式锁实现看这篇文章就对了>),已经介绍过几种java分布式锁,今天来个Redis分布式锁的demo.redis 现在已经成为系统缓存的必备组件 ...
- Spring+SpringMVC+Mybatis整合redis
SSM整合redis redis是一种非关系型数据库,与mongoDB不同的是redis是内存数据库,所以访问速度很快.常用作缓存和发布-订阅式的消息队列. 这里用的是ssm框架+maven构建的项目 ...
- SpringCache整合Redis
之前一篇文章 SpringBoot整合Redis 已经介绍了在SpringBoot中使用redisTemplate手动 操作redis数据库的方法了.其实这个时候我们就已经可以拿redis来做项目了, ...
- Linux就这个范儿 第12章 一个网络一个世界
Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...
- SpringBoot进阶教程(二十六)整合Redis之共享Session
集群现在越来越常见,当我们项目搭建了集群,就会产生session共享问题.因为session是保存在服务器上面的.那么解决这一问题,大致有三个方案,1.通过nginx的负载均衡其中一种ip绑定来实现( ...
- SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用
在上一篇文章(<SpringBoot(二十四)整合Redis>)中,已经实现了Spring Boot对Redis的整合,既然已经讲到Cache了,今天就介绍介绍缓存注解.各家互联网产品现在 ...
- SpringBoot进阶教程(二十四)整合Redis
缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力.Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非 ...
- Spring Boot 2.x整合Redis
最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...
- SpringBoot整合Redis及Redis工具类撰写
SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果.因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable). ...
随机推荐
- 如果你需要从不同的服务器(不同域名)上获取数据就需要使用跨域 HTTP 请求
Response.AppendHeader("Access-Control-Allow-Origin", "*")Response.AppendHeader(& ...
- atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结 1. nfc(近距离无线通讯技术) 1 2. 工作模式 1 3. NFC 蓝牙 红外具体对比如下表: 2 4. TypeA ...
- Atitit. 。Jna技术与 解决 java.lang.Error: Invalid memory access
Atitit. .Jna技术与 解决 java.lang.Error: Invalid memory access 1. 原因与解决1 2. jNA (这个ms sun 的)1 3. Code1 4. ...
- java虚拟机的逃逸分析
逃逸分析作为其他优化手段提供依据的分析技术,其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为方法逃逸.甚至还有可能被外部线程 ...
- 在控制台快速定位js函数
最近在搞教务处的模拟登录,教务处用js加密密码和账号,为了构造能用的post数据,需要快速的找到对应的js代码.但是,那么多js代码,手动找会找到死的. 恰好学习了两个快速定位的方法:console ...
- RabbitMQ学习之:(一)初识、概念及心得
因为网上有一篇很好的RMQ的入门帖子http://lostechies.com/derekgreer/tag/rabbitmq/,所以我就不多说了,就说说我目前看了该作者1~5章后,自己的心得.(所以 ...
- jdbc.properties
#privilege database privilege.jdbc.driverClassName=com.mysql.jdbc.Driver privilege.jdbc.url=jdbc\:my ...
- 【犀牛书笔记】JavaScript正则表达式的模式匹配
正则表达式,是一个描述字符模式的对象. JavaScript用RegExp类表示正则表达式 String和RegExp都定义了相关方法 原创文章,转载请注明:http://www.cnblogs.co ...
- vhost in nodejs
关于vhost 个人理解为vhost是一种可以在一个ip下同时部署多个不同域名站点的的概念. 其好处就是对一些小型的网站不必每个网站都占用一个ip,或者说一个服务,举个例子,vhost的概念就相当于打 ...
- 临界区(Critical Section)的封装和使用示例
向我老大致敬! 这个做法其实是抄我老大的.服务器中,多线程经常需要使用临界区,为了简化代码的使用,把临界区封装为 CThreadLockHandle 类,通过封装,使用临界区资源每次只需要一行代码, ...