1 Star 1 Fork 0

springboot进阶 / springboot-advanced-redis

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

redis教程(redis安装及使用请点击这里)

springboot官方文档

项目地址

Redis 优势

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

springboot 提供了 redis操作工具包

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

application.yml 配置如下

spring:
  application:
    # 服务名
    name: advanced
  #redis配置数据
  redis:
    hostName: 123.206.19.217
    port: 6379
    database: 10
    password:
    pool:
      maxActive: 10
      maxWait: -1
      maxIdle: 100
      minIdle: 0
    timeout: 5000
server:
 # 服务端口
  port: 9001

第一步:@Bean创建redis工具的实例

package com.advanced.config.redis;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisConfig {

    @Bean(name = "jedisPoolConfig")
    @ConfigurationProperties(prefix = "spring.redis.pool")
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig config = new JedisPoolConfig();
        return config;
    }

    @Bean(name = "jedisConnectionFactory")
    @ConfigurationProperties(prefix = "spring.redis")
    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        JedisPoolConfig config = jedisPoolConfig;
        factory.setPoolConfig(config);
        return factory;
    }


    @Bean(name = "redisTemplate" )
    public RedisTemplate<?, ?> getRedisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate<?, ?> redisTemplate = new StringRedisTemplate(jedisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // value的序列化类型
        // 设置启用事务支持
        redisTemplate.setEnableTransactionSupport(true);
        return redisTemplate;
    }
}

这样在程序中就可以使用此实例来操作redis

@Autowired
public RedisTemplate redisTemplate;

redis 方法介绍

同redis set命令对应方法

// 将字符串值 value 关联到 key 存储至redis.如果redis库中有相同的key,key将被覆盖
 redisTemplate.opsForValue().set("userName","Liuzhiqiang");
 等价于:
 set userName Liuzhiqiang
 
 // 将值 value 关联到 key ,并设置 key 的生存时间。
 redisTemplate.opsForValue().set("userId",12, 10, TimeUnit.SECONDS);
  等价于:
 SET userId 12 EX 10

同redis get命令对应方法

// 根据key从redis中取出value
redisTemplate.opsForValue().get("userName")
等价于
get userName

// 根据key从redis中取出截取后value,value只能是字符串 
// -1 为最后一位, -2为倒数第二位,以此类推
redisTemplate.opsForValue().get("userName",3, -1)
等价于
 GETRANGE userName 3 -1 
 
 // 给key重新分配一个value并返回旧值
  String str = (String) redisTemplate.opsForValue().getAndSet("userName", "wangyan")
 等价于
 GETSET userName wangyan 
 

同redis del对应方法

// 根据key从redis库中删除
redisTemplate.delete("userName");
等价于 
del userName


/**
* 批量删除
*/

List<String> list = new ArrayList<>();
list.add("userName");
list.add("userId");
redisTemplate.delete(list);
等价于
DEL userName userId

redis事务在Java里应用

// 设置启用事务支持
redisTemplate.setEnableTransactionSupport(true);

声明事务

redisTemplate.multi();
等价于
MULTI        

执行所有事务块内的命令

List<String> list = redisTemplate.exec();
等价于
exec

取消事务

redisTemplate.discard();
等价于
discard

监视一个(或多个) key

如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
redisTemplate.discard();
redisTemplate.watch("userName");
等价于
WATCH userName


List<String> list = new ArrayList<>();
list.add("userName");
list.add("userId");
redisTemplate.watch(list);
等价于
WATCH userName userId

取消 WATCH 命令对所有 key 的监视。

redisTemplate.unwatch();
等价于
UNWATCH

示例代码

package com.advanced.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 开发公司:个人
 * 版权:个人
 * <p>
 * IndexController
 *
 * @author 刘志强
 * @created Create Time: 2019/5/23
 */
@Controller
public class IndexController {
    @Autowired
    public RedisTemplate redisTemplate;

    private Logger logger = LoggerFactory.getLogger(getClass());
    // 重定向至首页
    @GetMapping("/")
    public void root(HttpServletResponse httpServletResponse) throws IOException {
        httpServletResponse.sendRedirect("/index");
    }

    /**
     *
     * @param type 0 开启事务 1 放弃事务
     * @return
     */
    @GetMapping("/affair")
    @ResponseBody
    public Map affair(int type) {



        logger.info("=========================================事务 开始======================================");

        /**
         * 开启一个事务
         */
        redisTemplate.multi();
            redisTemplate.opsForValue().set ("11","11");
            redisTemplate.opsForValue().set("22","22");
            redisTemplate.opsForValue().set("33","33");
            redisTemplate.opsForValue().get("11");
            redisTemplate.opsForValue().get("22");
            redisTemplate.opsForValue().get("33");
        if (type == 0) {
            /**
             * 执行所有事务块内的命令。
             */
            List<String> list = redisTemplate.exec();
            list.forEach(o -> logger.info(o));
        }  else {
            /**
             * 取消事务,放弃执行事务块内的所有命令。如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。
             */
        }
        return null;
    }


    @GetMapping("/index")
    @ResponseBody
    public Map index() {

        logger.info("=========================================get,set,del 开始======================================");

        /**
         * 将字符串值 value 关联到 key 存储至redis.如果redis库中有相同的key,key将被覆盖
         * 第一个参数 key
         * 第二个参数 value
         * 等同 SET
         */
        redisTemplate.opsForValue().set("userName","Liuzhiqiang");



        /**
         * 将值 value 关联到 key ,并设置 key 的生存时间。
         * 第一个参数 key
         * 第二个参数 value
         * 第三个参数 生存时间
         * 第四个参数 生存时间类型
         * 等同 SETEX
         */
        redisTemplate.opsForValue().set("userId",12, 10, TimeUnit.SECONDS);
        logger.info(String.valueOf(redisTemplate.opsForValue().get("userId")));



        /**
         * 根据key从redis中取出value
         * 第一个参数 key
         * 等同 GET
         */
        logger.info((String) redisTemplate.opsForValue().get("userName"));





        /**
         *  根据key从redis中取出截取后value,value只能是字符串
         *  第一个参数 key
         *  第二个参数开始位置
         *  第三个参数结束位置 -1 为最后一位, -2为倒数第二位,以此类推
         */
        logger.info(redisTemplate.opsForValue().get("userName",3, -1));





        /**
         *给key重新分配一个value并返回旧值
         * 第一个参数key
         * 第二个参数新的value
         */
        String str = (String) redisTemplate.opsForValue().getAndSet("userName", "wangyan");
        logger.info(str);
        logger.info((String) redisTemplate.opsForValue().get("userName"));





        /**
         * 根据key从redis库中删除
         * 第一个参数 key
         * 等同 DEL
         */
        redisTemplate.delete("userName");
        logger.info((String) redisTemplate.opsForValue().get("userName"));





        List<String> list = new ArrayList<>();
        list.add("userName");
        list.add("userId");
        /**
         * 批量删除
         */
        redisTemplate.delete(list);
        logger.info((String) redisTemplate.opsForValue().get("userName"));
        logger.info((String) redisTemplate.opsForValue().get("userId"));

        logger.info("=========================================get,set,del 结束======================================");
        return null;

    }


}

空文件

简介

springboot集成redis ,及redis常用方法使用说明 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/springboot_advancement/springboot-advanced-redis.git
git@gitee.com:springboot_advancement/springboot-advanced-redis.git
springboot_advancement
springboot-advanced-redis
springboot-advanced-redis
master

搜索帮助