第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:退出客户端连接。

原文地址:https://www.cnblogs.com/jinxiaohang/p/8321890.html