Redis

Redis简介及理解

简介

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

理解

Redis是一个把数据存储在内存上的工具,优势就是快,支持数据类型丰富等。Redis本身和数据库没有关系,他们的使用场景不一样。

Java与Redis

SpringBoot整合Redis有两种方式,分别是Jedis和RedisTemplate。

Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。目前官方推荐的是SpringDataRedis形式,相对于Jedis来说可以方便地更换Redis的Java客户端,其比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache。

实战模拟

Jedis

必要依赖

<!--Redis(Jedis)-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.5.0</version>
</dependency>

工具类

package yuri.akira.demo.util;

import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Component
public class RedisUtil {

    private static JedisPool jedisPool = null;//连接池

    private static String IP = "127.0.0.1";//IP
    private static int PORT = 6379;//端口,Redis默认6379
    private static String password = "???";//密码,开始没有密码
    private static int MAX_ACTIVE = 1024;//实例最大连接数
    private static int MAX_IDLE = 200;//空闲的(idle)Jedis实例数,default:8
    private static int MAX_WAIT = 10000;//等待可用连接最大时间,ms,default:-1
    private static int TIMEOUT = 10000;//超时时间
    private static boolean TEST_ON_BORROW = true;//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config, IP, PORT, TIMEOUT); //Redis有密码参数放TIMEOUT后,没有就不用加参数。
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public synchronized Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void returnResource (final Jedis jedis){
        if (jedis != null){
            jedisPool.returnResource(jedis);
        }
    }
}

对于工具类的参数设置,一般而言是放在配置文件里通过@ConfigurationProperties(),@Value等来进行值的注入,此处只是为了方便。

为了方便使用Spring的Bean注入等功能,此处使用一个类写Redis测试类函数实体,另一个作为Test启动类放在测试目录里。

测试方法类

package yuri.akira.demo.util;

import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import yuri.akira.demo.util.RedisUtil;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
public class RedisJedis {

    private Jedis jedis;

    @Resource
    RedisUtil redisUtil;

    /*连接服务器*/
    public void connectRedis() {
        jedis = redisUtil.getJedis();
    }

    /*redis操作简单字符串测试*/
    public void testString() {
        System.out.println("Redis操作简单字符串测试:");
        /*添加数据*/
        jedis.set("name", "Yuri");
        System.out.println(jedis.get("name"));

        /*拼接字符串*/
        jedis.append("name", ".Ming");
        System.out.println(jedis.get("name"));

        /*删除数据*/
        jedis.del("name");
        System.out.println(jedis.get("name"));

        /*设置多个键值对*/
        jedis.mset("name", "yuri", "age", "22", "sexy", "boy");
        jedis.incr("age");/* +1操作 */
        System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("sexy"));
        System.out.println();
    }

    /*Redis操作map*/
    public void testMap() {
        System.out.println("Redis操作map的测试:");

        Map<String, String> map = new HashMap<>();
        map.put("name", "Yuri");
        map.put("age", "22");
        map.put("sexy", "boy");
        jedis.hmset("MAP", map);

        /*hmget()第一个参数是map的key,后面参数为存入此map对象的key,本身返回一个List<String>*/
        System.out.println(jedis.hmget("MAP", "name", "age", "sexy"));

        /*删除map中某个键值*/
        System.out.println(jedis.hkeys("MAP"));
        jedis.hdel("MAP", "sexy");
        System.out.println(jedis.hkeys("MAP"));
        System.out.println();
    }

    /*Redis操作List*/
    public void testList() {
        jedis.del("LIST");
        jedis.lpush("LIST", "Akira");
        jedis.lpush("LIST", "Yuri");
        jedis.lpush("LIST", "Ming");
/*        再取出所有数据jedis.lrange是按范围取出
        第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有*/
        System.out.println(jedis.lrange("LIST", 0, -1));
        jedis.del("LIST");
        jedis.rpush("LIST", "Akira");
        jedis.rpush("LIST", "Yuri");
        jedis.rpush("LIST", "Ming");
        System.out.println(jedis.lrange("LIST", 0, -1));
        System.out.println();
    }

    /*Redis操作Set*/
    public void testSet(){
        jedis.sadd("SET", "Yuri");
        jedis.sadd("SET", "Akira");
        jedis.sadd("SET", "Ming");
        jedis.sadd("SET", "Xs");
        System.out.println(jedis.smembers("SET"));//获取所有value
        jedis.srem("SET", "Xs");//删除
        System.out.println(jedis.sismember("SET", "Xs"));//查询是否存在
        System.out.println(jedis.srandmember("SET"));//返回随机元素
        System.out.println(jedis.scard("SET"));//返回集合元素个数
        System.out.println();
    }

    /*Redis排序*/
    public void testSort(){
        /*r,l是List操作,表明从左插入和从右插入*/
        jedis.rpush("SORT", "2");
        jedis.lpush("SORT", "4");
        jedis.lpush("SORT", "1");
        jedis.lpush("SORT", "3");
        System.out.println(jedis.lrange("SORT", 0, -1));
        System.out.println(jedis.sort("SORT"));
        System.out.println(jedis.lrange("SORT", 0, -1));
        System.out.println();
    }
}

启动器类

package yuri.akira.demo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import yuri.akira.demo.util.RedisTest;
import yuri.akira.demo.util.RedisUtil;

import javax.annotation.Resource;

@SpringBootTest
public class TestRedisRun {

    @Resource
    RedisTest redisTest;

    @Test
    public void test1(){
        redisTest.connectRedis();
        redisTest.testString();
        redisTest.testMap();
        redisTest.testList();
        redisTest.testSet();
        redisTest.testSort();
    }
}

RedisTemplate

必要依赖

<!--Redis(RedisTemplate)-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

yml配置文件

spring:
  redis:
    # 数据库索引,默认为0,避免数据库冲突
    database: 3
    #redis服务器地址
    host: 127.0.0.1
    #redis端口
    port: 6379
    #redis密码,默认空
    password:
    #连接超时时间
    timeout: 10000
    #连接池配置
    jedis:
      pool:
        #最大可用连接数(默认8,负数表示无限)
        max-active: 1024
        #最大空闲连接数(默认8,负数表示无限)
        max-idle: 200
        #最小空闲连接数(默认0)
        min-idle: 0
        #连接最大等待时间(默认-1,ms,负数表示无限)
        max-wait: 10000

测试类

package yuri.akira.demo.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Component
public class RedisTemplateTest {
    @Resource
    RedisTemplate redisTemplate;

    /*直接使用,无需连接*/
    public void testString(){
        /*通过redisTemplate设置值*/
        redisTemplate.boundValueOps("Key1").set("Value1");
        System.out.println(redisTemplate.hasKey("Key1"));
        System.out.println(redisTemplate.opsForValue().get("Key1"));

    /*通过BoundValueOperations设置值*/
        BoundValueOperations stringKey = redisTemplate.boundValueOps("Key2");
        stringKey.set("Vaule2");
        System.out.println(stringKey.getKey());

    /*通过ValueOperations设置值*/
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("Key3", "Vaule3");
        System.out.println(ops.get("Key3"));
    }
}

RedisTemplate只需引入依赖后在yml文件配置对应参数,然后使用时直接注入即可,非常简单方便。

此处只简单对RedisTemplate类方法进行模拟,其他详细方法并没有过多涉及。

以上就是简单的Redis操作。

注意

Redis每次使用都要启动服务器,WIndows下可以自行写个CMD脚本命令

::设置磁盘路径
F:
::进入redis目录
cd F:\SoftWare\Redis-x64-5.0.10
::启动服务
redis-server.exe

也可以直接注册服务:

进行Redis根路径

#注册安装服务
redis-server --service-install redis.windows.conf --loglevel verbose
#卸载服务
#redis-server --service-uninstall

然后在任务管理器可以把这个服务设为自动,以后则不需要手动启动Redis了。

项目代码

链接:https://pan.baidu.com/s/1U_tQTtM9cGXBvxrdZvgABA
提取码:Yuri

以上
posted @ 2020-11-20 11:10  AkimotoAkira  阅读(80)  评论(0编辑  收藏  举报