SpringBoot集成Redis如何使用RedisRepositories

    SpringBoot集成Redis 1.添加redis依赖<
    dependency>

    <
    groupId>
    org.springframework.boot<
    /groupId>

    <
    artifactId>
    spring-boot-starter-data-redis<
    /artifactId>

    <
    /dependency>

    <
    dependency>

    <
    groupId>
    org.apache.commons<
    /groupId>

    <
    artifactId>
    commons-pool2<
    /artifactId>

    <
    /dependency>
    2.在application.properties中添加redis配置信息spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.lettuce.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.lettuce.pool.max-wait=-1
    # 连接池中的最大空闲连接
    spring.redis.lettuce.pool.max-idle=8
    # 连接池中的最小空闲连接
    spring.redis.lettuce.pool.min-idle=0
    # 连接超时时间(毫秒)
    spring.redis.timeout=30000 3.SpringBoot启动类中添加注解配置@EnableCaching
    @EnableRedisRepositories
    //注解开启使用RedisRepositories
    //CRUD操作将会操作redis中的数据
    @SpringBootApplication
    public class RedisApplication {

    public static void main(String[] args) {
    SpringApplication.run(RedisApplication.class, args);

    }
    } 4.创建实体类Entity@Data
    @RedisHash("
    user"
    )
    //RedisHash非常重要
    //user表示在redis中新建user集合
    //之后所有的UserEntity的保存操作全部会保存在user这个集合中
    //保存时Key的格式为——user:id
    public class UserEntity{
    @Id
    private Long id;

    private String name;

    private Integer age;

    private Date createTime = new Date();

    } 5.创建Dao层&
    mdash;
    &
    mdash;
    数据操作层@Repository
    public interface UserDao extends CrudRepository<
    UserEntity,Long>
    {
    } 6.创建Service层&
    mdash;
    &
    mdash;
    服务层@Service
    public class UserService {

    @Autowired
    private UserDao userDao;


    //因为使用了RedisRepositories,所以简单的crud将不用使用RedisTemplate
    // @Autowired
    // private RedisTemplate redisTemplate;


    /**
    * 按user:id的方式存入redis
    * @param user
    */
    public void save(UserEntity user){
    //redisTemplate.opsForValue().set(new Random().nextDouble() + "
    "
    ,user);

    userDao.save(user);

    }

    /**
    * 根据key从redis中查找对应value
    * @param id
    * @return
    */
    public UserEntity findOne(Long id){
    //UserEntity user = (UserEntity) redisTemplate.opsForValue().get(key);

    UserEntity user = userDao.findById(id).get();

    return user;

    }
    } 7.创建Controller层&
    mdash;
    &
    mdash;
    控制层@RestController
    @RequestMapping("
    user"
    )
    public class UserController {

    @Autowired
    private UserService userService;


    /**
    * 保存到redis中
    * @return
    */
    @GetMapping("
    save"
    )
    public String save(){

    UserEntity user = new UserEntity();

    user.setName(String.valueOf(new Random().nextInt(100000)));

    user.setAge(new Random().nextInt(100000));

    userService.save(user);

    System.out.println(user.toString());

    return "
    success"
    ;

    }

    /**
    * 根据key从redis中查找value
    * @param id
    * @return
    */
    @GetMapping("
    find/{id}"
    )
    public String find(@PathVariable Long id){
    UserEntity user = userService.findOne(id);


    System.out.println(user);

    return "
    success"
    ;

    }
    } 8.redis配置类@Configuration
    public class RedisConfig {

    @Bean
    public RedisTemplate<
    String, Object>
    redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<
    String, Object>
    template = new RedisTemplate<
    String, Object>
    ();

    template.setConnectionFactory(factory);

    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    ObjectMapper om = new ObjectMapper();

    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

    jackson2JsonRedisSerializer.setObjectMapper(om);

    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

    // key采用String的序列化方式
    template.setKeySerializer(stringRedisSerializer);

    // hash的key也采用String的序列化方式
    template.setHashKeySerializer(stringRedisSerializer);

    // value序列化方式采用jackson
    template.setValueSerializer(jackson2JsonRedisSerializer);

    // hash的value序列化方式采用jackson
    template.setHashValueSerializer(jackson2JsonRedisSerializer);

    template.afterPropertiesSet();

    return template;

    }
    } Redis中的结构为

    SpringBoot集成Redis,大幅提升Web开发效率!

    redis封装工具类@Component
    public class RedisUtils {

    @Autowired
    private RedisTemplate<
    String, Object>
    redisTemplate;


    // =============================common============================

    /**
    * 指定缓存失效时间
    *
    * @param key 键
    * @param time 时间(秒)
    * @return
    */
    public boolean expire(String key, long time) {
    try {
    if (time >
    0) {
    redisTemplate.expire(key, time, TimeUnit.SECONDS);

    }
    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 根据key 获取过期时间
    *
    * @param key 键 不能为null
    * @return 时间(秒) 返回0代表为永久有效
    */
    public long getExpire(String key) {
    return redisTemplate.getExpire(key, TimeUnit.SECONDS);

    }

    /**
    * 判断key是否存在
    *
    * @param key 键
    * @return true 存在 false不存在
    */
    public boolean hasKey(String key) {
    try {
    return redisTemplate.hasKey(key);

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 删除缓存
    *
    * @param key 可以传一个值 或多个
    */
    @SuppressWarnings("
    unchecked"
    )
    public void del(String... key) {
    if (key != null &
    &
    key.length >
    0) {
    if (key.length == 1) {
    redisTemplate.delete(key[0]);

    } else {
    redisTemplate.delete(CollectionUtils.arrayToList(key));

    }
    }
    }
    // ============================String=============================

    /**
    * 普通缓存获取
    *
    * @param key 键
    * @return 值
    */
    public Object get(String key) {
    return key == null ? null : redisTemplate.opsForValue().get(key);

    }

    /**
    * 普通缓存放入
    *
    * @param key 键
    * @param value 值
    * @return true成功 false失败
    */
    public boolean set(String key, Object value) {
    try {
    redisTemplate.opsForValue().set(key, value);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 普通缓存放入并设置时间
    *
    * @param key 键
    * @param value 值
    * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
    * @return true成功 false 失败
    */
    public boolean set(String key, Object value, long time) {
    try {
    if (time >
    0) {
    redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);

    } else {
    set(key, value);

    }
    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 递增
    *
    * @param key 键
    * @param delta 要增加几(大于0)
    * @return
    */
    public long incr(String key, long delta) {
    if (delta <
    0) {
    throw new RuntimeException("
    递增因子必须大于0"
    );

    }
    return redisTemplate.opsForValue().increment(key, delta);

    }

    /**
    * 递减
    *
    * @param key 键
    * @param delta 要减少几(小于0)
    * @return
    */
    public long decr(String key, long delta) {
    if (delta <
    0) {
    throw new RuntimeException("
    递减因子必须大于0"
    );

    }
    return redisTemplate.opsForValue().increment(key, -delta);

    }
    // ================================Map=================================

    /**
    * HashGet
    *
    * @param key 键 不能为null
    * @param item 项 不能为null
    * @return 值
    */
    public Object hget(String key, String item) {
    return redisTemplate.opsForHash().get(key, item);

    }

    /**
    * 获取hashKey对应的所有键值
    *
    * @param key 键
    * @return 对应的多个键值
    */
    public Map<
    Object, Object>
    hmget(String key) {
    return redisTemplate.opsForHash().entries(key);

    }

    /**
    * HashSet
    *
    * @param key 键
    * @param map 对应多个键值
    * @return true 成功 false 失败
    */
    public boolean hmset(String key, Map<
    String, Object>
    map) {
    try {
    redisTemplate.opsForHash().putAll(key, map);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * HashSet 并设置时间
    *
    * @param key 键
    * @param map 对应多个键值
    * @param time 时间(秒)
    * @return true成功 false失败
    */
    public boolean hmset(String key, Map<
    String, Object>
    map, long time) {
    try {
    redisTemplate.opsForHash().putAll(key, map);

    if (time >
    0) {
    expire(key, time);

    }
    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 向一张hash表中放入数据,如果不存在将创建
    *
    * @param key 键
    * @param item 项
    * @param value 值
    * @return true 成功 false失败
    */
    public boolean hset(String key, String item, Object value) {
    try {
    redisTemplate.opsForHash().put(key, item, value);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 向一张hash表中放入数据,如果不存在将创建
    *
    * @param key 键
    * @param item 项
    * @param value 值
    * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
    * @return true 成功 false失败
    */
    public boolean hset(String key, String item, Object value, long time) {
    try {
    redisTemplate.opsForHash().put(key, item, value);

    if (time >
    0) {
    expire(key, time);

    }
    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 删除hash表中的值
    *
    * @param key 键 不能为null
    * @param item 项 可以使多个 不能为null
    */
    public void hdel(String key, Object... item) {
    redisTemplate.opsForHash().delete(key, item);

    }

    /**
    * 判断hash表中是否有该项的值
    *
    * @param key 键 不能为null
    * @param item 项 不能为null
    * @return true 存在 false不存在
    */
    public boolean hHasKey(String key, String item) {
    return redisTemplate.opsForHash().hasKey(key, item);

    }

    /**
    * hash递增 如果不存在,就会创建一个 并把新增后的值返回
    *
    * @param key 键
    * @param item 项
    * @param by 要增加几(大于0)
    * @return
    */
    public double hincr(String key, String item, double by) {
    return redisTemplate.opsForHash().increment(key, item, by);

    }

    /**
    * hash递减
    *
    * @param key 键
    * @param item 项
    * @param by 要减少记(小于0)
    * @return
    */
    public double hdecr(String key, String item, double by) {
    return redisTemplate.opsForHash().increment(key, item, -by);

    }
    // ============================set=============================

    /**
    * 根据key获取Set中的所有值
    *
    * @param key 键
    * @return
    */
    public Set<
    Object>
    sGet(String key) {
    try {
    return redisTemplate.opsForSet().members(key);

    } catch (Exception e) {
    e.printStackTrace();

    return null;

    }
    }

    /**
    * 根据value从一个set中查询,是否存在
    *
    * @param key 键
    * @param value 值
    * @return true 存在 false不存在
    */
    public boolean sHasKey(String key, Object value) {
    try {
    return redisTemplate.opsForSet().isMember(key, value);

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 将数据放入set缓存
    *
    * @param key 键
    * @param values 值 可以是多个
    * @return 成功个数
    */
    public long sSet(String key, Object... values) {
    try {
    return redisTemplate.opsForSet().add(key, values);

    } catch (Exception e) {
    e.printStackTrace();

    return 0;

    }
    }

    /**
    * 将set数据放入缓存
    *
    * @param key 键
    * @param time 时间(秒)
    * @param values 值 可以是多个
    * @return 成功个数
    */
    public long sSetAndTime(String key, long time, Object... values) {
    try {
    Long count = redisTemplate.opsForSet().add(key, values);

    if (time >
    0)
    expire(key, time);

    return count;

    } catch (Exception e) {
    e.printStackTrace();

    return 0;

    }
    }

    /**
    * 获取set缓存的长度
    *
    * @param key 键
    * @return
    */
    public long sGetSetSize(String key) {
    try {
    return redisTemplate.opsForSet().size(key);

    } catch (Exception e) {
    e.printStackTrace();

    return 0;

    }
    }

    /**
    * 移除值为value的
    *
    * @param key 键
    * @param values 值 可以是多个
    * @return 移除的个数
    */
    public long setRemove(String key, Object... values) {
    try {
    Long count = redisTemplate.opsForSet().remove(key, values);

    return count;

    } catch (Exception e) {
    e.printStackTrace();

    return 0;

    }
    }
    // ===============================list=================================

    /**
    * 获取list缓存的内容
    *
    * @param key 键
    * @param start 开始
    * @param end 结束 0 到 -1代表所有值
    * @return
    */
    public List<
    Object>
    lGet(String key, long start, long end) {
    try {
    return redisTemplate.opsForList().range(key, start, end);

    } catch (Exception e) {
    e.printStackTrace();

    return null;

    }
    }

    /**
    * 获取list缓存的长度
    *
    * @param key 键
    * @return
    */
    public long lGetListSize(String key) {
    try {
    return redisTemplate.opsForList().size(key);

    } catch (Exception e) {
    e.printStackTrace();

    return 0;

    }
    }

    /**
    * 通过索引 获取list中的值
    *
    * @param key 键
    * @param index 索引 index>
    =0时, 0 表头,1 第二个元素,依次类推;index<
    0时,-1,表尾,-2倒数第二个元素,依次类推
    * @return
    */
    public Object lGetIndex(String key, long index) {
    try {
    return redisTemplate.opsForList().index(key, index);

    } catch (Exception e) {
    e.printStackTrace();

    return null;

    }
    }

    /**
    * 将list放入缓存
    *
    * @param key 键
    * @param value 值
    * @return
    */
    public boolean lSet(String key, Object value) {
    try {
    redisTemplate.opsForList().rightPush(key, value);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 将list放入缓存
    *
    * @param key 键
    * @param value 值
    * @param time 时间(秒)
    * @return
    */
    public boolean lSet(String key, Object value, long time) {
    try {
    redisTemplate.opsForList().rightPush(key, value);

    if (time >
    0)
    expire(key, time);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 将list放入缓存
    *
    * @param key 键
    * @param value 值
    * @return
    */
    public boolean lSet(String key, List<
    Object>
    value) {
    try {
    redisTemplate.opsForList().rightPushAll(key, value);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 将list放入缓存
    *
    * @param key 键
    * @param value 值
    * @param time 时间(秒)
    * @return
    */
    public boolean lSet(String key, List<
    Object>
    value, long time) {
    try {
    redisTemplate.opsForList().rightPushAll(key, value);

    if (time >
    0)
    expire(key, time);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 根据索引修改list中的某条数据
    *
    * @param key 键
    * @param index 索引
    * @param value 值
    * @return
    */
    public boolean lUpdateIndex(String key, long index, Object value) {
    try {
    redisTemplate.opsForList().set(key, index, value);

    return true;

    } catch (Exception e) {
    e.printStackTrace();

    return false;

    }
    }

    /**
    * 移除N个值为value
    *
    * @param key 键
    * @param count 移除多少个
    * @param value 值
    * @return 移除的个数
    */
    public long lRemove(String key, long count, Object value) {
    try {
    Long remove = redisTemplate.opsForList().remove(key, count, value);

    return remove;

    } catch (Exception e) {
    e.printStackTrace();

    return 0;

    }
    }
    }

    RedisRepositories是Spring Data Redis提供的一个高效的使用Redis的方法。使用RedisRepositories可以帮助开发者处理大多数与Redis相关的操作,包括数据的存储、更新、删除等,从而大大提高了开发效率。本文将讲解如何使用SpringBoot集成Redis,并详细介绍如何使用RedisRepositories来管理Redis数据。
    1. SpringBoot集成Redis的配置
    在SpringBoot应用中,集成Redis十分方便。只需要在pom.xml文件中加入spring-boot-starter-data-redis依赖即可。在application.properties文件中进行如下配置:
    spring.redis.host=localhost
    spring.redis.port=6379
    这样,SpringBoot就可以自动创建一个RedisConnectionFactory(Redis连接工厂),并自动注入至后续的RedisRepositories的使用中。当然,如果需要更加细粒度的Redis配置,可以在application.properties文件中增加更多配置项。例如,如果需要设置Redis的密码,可以添加如下配置:
    spring.redis.password=foobared
    2. RedisRepositories的使用
    RedisRepositories基于Spring Data Redis定义了一套Repository接口,用于对Redis数据进行CRUD操作。通过在RedisRepository接口中定义方法名,即可实现多种Redis操作。
    RedisRepositories的操作包括键值对存储(key-value),Hash(哈希表)存储,列表存储等,还可以通过注解的方式来自定义Redis操作。这样,开发者所需完成的工作就只是定义接口,RedisRepositories会根据方法名自动实现对应的Redis操作,大大降低了开发难度。
    下面以键值对存储为例,介绍RedisRepositories的使用。首先定义一个接口,如下:
    public interface RedisKeyValueRepository extends KeyValueRepository {
    }
    该接口继承了Spring Data Redis提供的KeyValueRepository接口,表示数据的键值对类型是String。接下来,只需在该接口中添加对应的CRUD方法,如下:
    public interface RedisKeyValueRepository extends KeyValueRepository {
    String findValueByKey(String key);
    void setValueByKey(String key, String value);
    void deleteByKey(String key);
    }
    这样,我们就可以使用RedisKeyValueRepository中的方法来完成对Redis的操作了。
    3. RedisRepositories的高级应用
    RedisRepositories还提供了一些高级应用的特性。例如,通过注解@RedisHash,可以将Redis中的Hash数据映射为Java对象,从而更加方便地进行CRUD操作。
    同时,在定义RedisRepositories的时候,也可以设置缓存策略。该策略可以指定Redis中存储的数据应该存活的时间,从而实现数据缓存的功能。
    RedisRepositories是一个强大的Redis管理框架,通过集成SpringBoot,可以轻松地使用RedisRepositories来完成对Redis的操作。本文只介绍了RedisRepositories的基础使用方法,还有更多高级用法在实际应用中可供挖掘。仅需简单的配置和接口定义,就可以快速地完成Redis的管理和应用。