[redis]在Java中使用redis

JAVA与REDIS

  • 在 Java Web 中的应用场景
    • 缓存
      • 特点
      • 情景
      • 考虑切入点
      • 读操作
      • 写操作
    • 高速读/写的场合
      • 使用场景
      • 流程步骤
  • 在 Java 中使用 Redis
    • 开启redis
      • 前提
      • 启动服务器端
      • 启动客户端
    • 第一步:添加 Jedis 依赖
    • 第二步:使用 Redis 连接池
    • 第三步:在 Spring 中使用 Redis
      • (1)第一步:使用Spring配置JedisPoolConfig对象
      • (2)第二步:为连接池配置工厂模型
      • (3)第三步:配置RedisTemplate
      • (4)第四步:编写测试
    • 第四步:在 SpringBoot 中使用 Redis
      • (1)在SpringBoot中添加Redis依赖:
      • (2)添加配置文件:

在 Java Web 中的应用场景

  • 存储 缓存 用的数据;
  • 需要高速读/写的场合使用它快速读/写;

缓存

特点

  • 读远超于写
  • 在redis中存放数据,服务端可以直接读取内存中的数据
  • 开销大,存常用的和主要的数据

情景

缓存的两种形式:(一些不常更新的数据)

页面缓存经常用在CMS(content manage system)内存管理系统里边(Smarty缓存),如新闻类信息

数据缓存经常会用在页面的具体数据里边

考虑切入点

  • **业务数据常用吗?命中率如何?**如果命中率很低,就没有必要写入缓存;
  • **该业务数据是读操作多,还是写操作多?**如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
  • **业务数据大小如何?**如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;

读操作

  1. 第一次读取数据的时候,Redis 数据会读取失败(此时redies中没有数据自然会读取失败),随即会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
  2. 第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。
  • 读操作的可能性远大于写操作,可用来处理日常中需要经常读去的数据,降低了对数据库的依赖

写操作

  • 更新或者写入的操作,需要多个 Redis 的操作,如果业务数据写次数远大于读次数那么就没有必要使用 Redis。

高速读/写的场合

使用场景

在某一个瞬间或者是某一个短暂的时刻有成千上万的请求到达服务器,如果单纯的使用数据库来进行处理,就算不崩,也会很慢的,轻则造成用户体验极差用户量流失重则数据库瘫痪,服务宕机,为应对高并发需求的场合,可以考虑使用redis

流程步骤

  1. 请求到达服务器时,只是把业务数据在 Redis 上进行读写,而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而满足高速响应的需求
  2. 缓存的数据仍然需要持久化(存入数据库中),所以在一个请求操作完 Redis 的读/写之后,会去判断该高速读写的业务是否结束,这个判断通常会在秒杀商品为0,红包金额为0时成立,如果不成立,则不会操作数据库;如果成立,则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。

在 Java 中使用 Redis

开启redis

一定要开启resis!!!!否则项目根本就连接不上redis!!!!

前提

确保自己的redis安装成功并且能正常使用

启动服务器端

[redis]在Java中使用redis_第1张图片

启动成功的标志
[redis]在Java中使用redis_第2张图片

启动客户端

[redis]在Java中使用redis_第3张图片

启动成功标志
[redis]在Java中使用redis_第4张图片

然后就可以开始在Java中使用了

第一步:添加 Jedis 依赖

想要在 Java 中使用 Redis 缓存,需要添加相关的Jar包依赖,打开Maven仓库的网站:https://mvnrepository.com/ ,搜索Jedis:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

  • 测试能否连通redis
    @Test

    public void redisTester() {

        Jedis jedis = new Jedis("127.0.0.1");
        System.out.println("connection success");
        System.out.println("client is runing:"+jedis.ping());
        }

[redis]在Java中使用redis_第5张图片

  • 手欠做一下写入性能的测试
    @Test
    public void redisTester() {
        int i = 0;
        try {
            long start = System.currentTimeMillis();// 开始毫秒数
            while (true) {
                long end = System.currentTimeMillis();
                if (end - start >= 1000) {// 当大于等于1000毫秒(相当于1秒)时,结束操作
                    break;
                }
                i++;
                jedis.set("test" + i, i + "");
            }
        } finally {// 关闭连接
            jedis.close();
        }
// 打印1秒内对Redis的操作次数
        System.out.println("redis每秒操作:" + i + "次");
    }
}

[redis]在Java中使用redis_第6张图片

  • 再测试一下
  1. 在redis目录下,按shift点右键,打开命令行
  2. 输入:redis-benchmark -n 100000 -q
    [redis]在Java中使用redis_第7张图片
  3. 结论:小破本本撑不住那么高的性能

第二步:使用 Redis 连接池

跟数据库连接池相同,Java Redis也同样提供了类redis.clients.jedis.JedisPool来管理Reids连接池对象,redis.clients.jedis.JedisPoolConfig对连接池进行配置

JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大空闲数
poolConfig.setMaxIdle(50);
// 最大连接数
poolConfig.setMaxTotal(100);
// 最大等待毫秒数
poolConfig.setMaxWaitMillis(20000);
// 使用配置创建连接池
JedisPool pool = new JedisPool(poolConfig, "localhost");
// 从连接池中获取单个连接
Jedis jedis = pool.getResource();
// 如果需要密码
//jedis.auth("password");

第三步:在 Spring 中使用 Redis

redis只有特定的数据类型,无法操作对象,spring针对这一问题提供了redisTemplate

  • 实现redisTemplate需要依赖的支持


    org.springframework.data
    spring-data-redis
    2.2.3.RELEASE

(1)第一步:使用Spring配置JedisPoolConfig对象

用 Spring 配置一个 JedisPoolConfig 对象









(2)第二步:为连接池配置工厂模型

Spring Data Redis中有四种可供我们选择的工厂模型

  • JredisConnectionFactory
  • JedisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory
    
        
        
        
        
        
        
        
        
    

(3)第三步:配置RedisTemplate

普通的连接没有办法直接将对象直接存入 Redis 内存中,需要将对象序列化(可以简单的理解为继承Serializable接口)。我们可以把对象序列化之后存入Redis缓存中,然后在取出的时候又通过转换器,将序列化之后的对象反序列化回对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6LLlP8w-1579483279541)(file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg)]

RedisTemplate会找到对应的序列化器去转换Redis的键值:

    

pojo类实现了serializable接口

(4)第四步:编写测试

 @Test

    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-redis.xml//上一步编写好的配置文件的名字");
        RedisTemplate redisTemplate = context.getBean(RedisTemplate.class);
        User user = new User();
        user.setName("bigbotle");
        redisTemplate.opsForValue().set("isMe", user);
        User isMe = (User) redisTemplate.opsForValue().get("isMe");
        isMe.test();
    }

}
@Data
class User implements Serializable{
    private  String name;
     public void test(){
         System.out.println("userName:"+name);

    }

  • 结果:
    [redis]在Java中使用redis_第8张图片

第四步:在 SpringBoot 中使用 Redis

(1)在SpringBoot中添加Redis依赖:



    org.springframework.boot
    spring-boot-starter-data-redis
    2.2.2.RELEASE

(2)添加配置文件:

在SpringBoot中使用.properties或者.yml都可以

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0

你可能感兴趣的:(还不知道怎么分类)