Spring 集成 Redis


pom.xml


<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.0.4.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>


spring-redis.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Redis Standalone 单节点配置 -->
    <bean id="redisStandaloneConfiguration" class="org.springframework.data.redis.connection.RedisStandaloneConfiguration">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="database" value="${redis.database}"/>
        <property name="password">
            <bean class="org.springframework.data.redis.connection.RedisPassword">
                <constructor-arg index="0" value="${redis.password}"/>
            </bean>
        </property>
    </bean>

    <!-- Redis 连接配置 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg name="standaloneConfig" ref="redisStandaloneConfiguration"/>
    </bean>

    <!-- Redis 序列化 -->
    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="jsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer">
        <!-- 使用默认的 ObjectMapper,移除JSON格式化后的 “@Class”节点 -->
        <constructor-arg name="mapper">
            <bean class="com.fasterxml.jackson.databind.ObjectMapper"/>
        </constructor-arg>
    </bean>

    <!-- Redis 持久化模板 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="jsonRedisSerializer"/>
        <property name="hashKeySerializer" ref="stringRedisSerializer"/>
        <property name="hashValueSerializer" ref="jsonRedisSerializer"/>
    </bean>
</beans>


spring-redis-sentine.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Redis 连接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        <property name="testOnReturn" value="${redis.testOnReturn}"/>
    </bean>

    <!-- Redis Sentine 哨兵集群配置 -->
    <bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <constructor-arg index="0" value="${redis.master}"/>
        <constructor-arg index="1">
            <set>
                <value>${redis.sentine.1}</value>
                <value>${redis.sentine.2}</value>
                <value>${redis.sentine.3}</value>
            </set>
        </constructor-arg>
        <property name="database" value="${redis.database}"/>
        <property name="password">
            <bean class="org.springframework.data.redis.connection.RedisPassword">
                <constructor-arg index="0" value="${redis.password}"/>
            </bean>
        </property>
    </bean>

    <!-- Redis 连接配置 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
        <constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration"/>
    </bean>

    <!-- Redis 序列化 -->
    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="jsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer">
        <!-- 使用默认的 ObjectMapper,移除JSON格式化后的 “@Class”节点 -->
        <constructor-arg name="mapper">
            <bean class="com.fasterxml.jackson.databind.ObjectMapper"/>
        </constructor-arg>
    </bean>

    <!-- Redis 持久化模板 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="jsonRedisSerializer"/>
        <property name="hashKeySerializer" ref="stringRedisSerializer"/>
        <property name="hashValueSerializer" ref="jsonRedisSerializer"/>
    </bean>
</beans>


RedisUtil.java


package com.app.core.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {
    /**
     * Spring Redis 基础操作模板
     */
    private static RedisTemplate<String, Object> redisTemp;
    /**
     * Redis 数据类型-字符串
     */
    private static ValueOperations<String, Object> valueOps;
    /**
     * Redis 数据类型-字典
     */
    private static HashOperations<String, String, Object> hashOps;
    /**
     * Redis 数据类型-列表
     */
    private static ListOperations<String, Object> listOps;
    /**
     * Redis 数据类型-集合
     */
    private static SetOperations<String, Object> setOps;
    /**
     * Redis 数据类型-有序集合
     */
    private static ZSetOperations<String, Object> zSetOps;

    @Autowired
    public void setRedisTemp(RedisTemplate<String, Object> redisTemp) {
        RedisUtil.redisTemp = redisTemp;
    }

    @Resource(name = "redisTemplate")
    public void setValueOps(ValueOperations<String, Object> valueOps) {
        RedisUtil.valueOps = valueOps;
    }

    @Resource(name = "redisTemplate")
    public void setHashOps(HashOperations<String, String, Object> hashOps) {
        RedisUtil.hashOps = hashOps;
    }

    @Resource(name = "redisTemplate")
    public void setListOps(ListOperations<String, Object> listOps) {
        RedisUtil.listOps = listOps;
    }

    @Resource(name = "redisTemplate")
    public void setSetOps(SetOperations<String, Object> setOps) {
        RedisUtil.setOps = setOps;
    }

    @Resource(name = "redisTemplate")
    public void setzSetOps(ZSetOperations<String, Object> zSetOps) {
        RedisUtil.zSetOps = zSetOps;
    }

    /**
     * 获取Spring Redis公共操作模板
     *
     * @return
     */
    public static RedisTemplate<String, Object> getRedisTemp() {
        return redisTemp;
    }

    /**
     * 获取默认序列化器
     * <p>默认序列化器为 JdkSerializationRedisSerializer</p>
     *
     * @return
     */
    public static RedisSerializer<?> getDefaultSlz() {
        return redisTemp.getDefaultSerializer();
    }

    /**
     * 获取字符串序列化器
     *
     * @return
     */
    public static RedisSerializer<String> getStringSlz() {
        return redisTemp.getStringSerializer();
    }

    /**
     * 获取缓存键序列化器
     *
     * @return
     */
    public static RedisSerializer<?> getKeySlz() {
        return redisTemp.getKeySerializer();
    }

    /**
     * 获取缓存值序列化器
     *
     * @return
     */
    public static RedisSerializer<?> getValueSlz() {
        return redisTemp.getValueSerializer();
    }

    /**
     * 获取字典缓存键序列化器
     *
     * @return
     */
    public static RedisSerializer<?> getHashKeySlz() {
        return redisTemp.getHashKeySerializer();
    }

    /**
     * 获取字典缓存值序列化器
     *
     * @return
     */
    public static RedisSerializer<?> getHashValueSlz() {
        return redisTemp.getHashValueSerializer();
    }

    /**
     * 获取字符串操作模板
     *
     * @return
     */
    public static ValueOperations<String, Object> getValueOps() {
        return valueOps;
    }

    /**
     * 获取字典操作模板
     *
     * @return
     */
    public static HashOperations<String, String, Object> getHashOps() {
        return hashOps;
    }

    /**
     * 获取列表操作模板
     *
     * @return
     */
    public static ListOperations<String, Object> getListOps() {
        return listOps;
    }

    /**
     * 获取集合操作模板
     *
     * @return
     */
    public static SetOperations<String, Object> getSetOps() {
        return setOps;
    }

    /**
     * 获取有序集合操作模板
     *
     * @return
     */
    public static ZSetOperations<String, Object> getzSetOps() {
        return zSetOps;
    }

    /**
     * 发布消息
     *
     * @param channel 发布频道
     * @param message 消息内容
     */
    public static void publish(String channel, Object message) {
        redisTemp.convertAndSend(channel, message);
    }

    /**
     * 获取所有缓存键
     * <p>通过正则表达式匹配</p>
     *
     * @param pattern
     * @return
     */
    public static Set<String> keys(String pattern) {
        return redisTemp.keys(pattern);
    }

    /**
     * 单个删除
     *
     * @param key
     */
    public static void delete(String key) {
        redisTemp.delete(key);
    }

    /**
     * 批量删除
     *
     * @param keys
     */
    public static void deleteAll(Collection<String> keys) {
        redisTemp.delete(keys);
    }

    /**
     * 批量删除
     * <p>通过正则表达式匹配</p>
     *
     * @param pattern
     */
    public static void deleteAll(String pattern) {
        redisTemp.delete(keys(pattern));
    }

    /**
     * 字符串-单个存值
     *
     * @param key
     * @param value
     */
    public static void valueSet(String key, Object value) {
        valueOps.set(key, value);
    }

    /**
     * 字符串-单个定时存值
     *
     * @param key
     * @param value
     * @param timeout 有效时间
     * @param unit    时间单位
     */
    public static void valueSet(String key, Object value, long timeout, TimeUnit unit) {
        valueOps.set(key, value, timeout, unit);
    }

    /**
     * 字符串-批量存值
     *
     * @param map
     */
    public static void valueMultiSet(Map<String, Object> map) {
        valueOps.multiSet(map);
    }

    /**
     * 字符串-单个取值
     *
     * @param key
     * @return
     */
    public static Object valueGet(String key) {
        return valueOps.get(key);
    }

    /**
     * 字符串-批量取值
     *
     * @param keys
     * @return
     */
    public static List<Object> valueMultiGet(Collection<String> keys) {
        return valueOps.multiGet(keys);
    }

    /**
     * 字符串-批量取值
     * <p>通过正则表达式匹配</p>
     *
     * @param pattern
     * @return
     */
    public static List<Object> valueMultiGet(String pattern) {
        return valueOps.multiGet(keys(pattern));
    }

    /**
     * 字典-单个存值
     *
     * @param key
     * @param hashKey
     * @param value
     */
    public static void hashPut(String key, String hashKey, Object value) {
        hashOps.put(key, hashKey, value);
    }

    /**
     * 字典-批量存值
     *
     * @param key
     * @param map
     */
    public static void hashPutAll(String key, Map<String, Object> map) {
        hashOps.putAll(key, map);
    }

    /**
     * 字典-单个取值
     *
     * @param key
     * @param hashKey
     * @return
     */
    public static Object hashGet(String key, String hashKey) {
        return hashOps.get(key, hashKey);
    }

    /**
     * 字典-批量取值
     *
     * @param key
     * @param hashKeys
     * @return
     */
    public static List<Object> hashMultiGet(String key, Collection<String> hashKeys) {
        return hashOps.multiGet(key, hashKeys);
    }

    /**
     * 字典-遍历键和值
     *
     * @param key
     * @return
     */
    public static Map<String, Object> hashEntries(String key) {
        return hashOps.entries(key);
    }

    /**
     * 字典-遍历键
     *
     * @param key
     * @return
     */
    public static Set<String> hashKeys(String key) {
        return hashOps.keys(key);
    }

    /**
     * 字典-遍历值
     *
     * @param key
     * @return
     */
    public static List<Object> hashValues(String key) {
        return hashOps.values(key);
    }

    /**
     * 字典-删除
     *
     * @param key
     * @param hashKeys
     */
    public static void hashDelete(String key, Object... hashKeys) {
        hashOps.delete(key, hashKeys);
    }

    /**
     * 列表-左边单个存值
     *
     * @param key
     * @param value
     * @return
     */
    public static Long listLeftPush(String key, Object value) {
        return listOps.leftPush(key, value);
    }

    /**
     * 列表-左边批量存值
     *
     * @param key
     * @param values
     * @return
     */
    public static Long listLeftPushAll(String key, Collection<Object> values) {
        return listOps.leftPushAll(key, values);
    }

    /**
     * 列表-右边单个存值
     *
     * @param key
     * @param value
     * @return
     */
    public static Long listRightPush(String key, Object value) {
        return listOps.rightPush(key, value);
    }

    /**
     * 列表-右边批量存值
     *
     * @param key
     * @param values
     * @return
     */
    public static Long listRightPushAll(String key, Collection<Object> values) {
        return listOps.rightPushAll(key, values);
    }

    /**
     * 列表-指定下标更新
     *
     * @param key
     * @param index
     * @param value
     */
    public static void listSet(String key, long index, Object value) {
        // 先判断是否存在当前下标的元素
        if (listOps.size(key) > index)
            listOps.set(key, index, value);
    }

    /**
     * 列表-左边取值
     *
     * @param key
     * @return
     */
    public static Object listLeftPop(String key) {
        return listOps.leftPop(key);
    }

    /**
     * 列表-右边取值
     *
     * @param key
     * @return
     */
    public static Object listRightPop(String key) {
        return listOps.rightPop(key);
    }

    /**
     * 列表-指定下标取值
     *
     * @param key
     * @param index
     * @return
     */
    public static Object listIndex(String key, long index) {
        return listOps.index(key, index);
    }

    /**
     * 列表-指定下标区间查看(不取值)
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public static List<Object> listRange(String key, long start, long end) {
        return listOps.range(key, start, end);
    }

    /**
     * 列表-查看所有列表值(不取值)
     *
     * @param key
     * @return
     */
    public static List<Object> listRangeAll(String key) {
        return listOps.range(key, 0, listOps.size(key));
    }

    /**
     * 列表-指定下标移除
     *
     * @param key
     * @param index
     * @param value
     * @return
     */
    public static Long listRemove(String key, long index, Object value) {
        return listOps.remove(key, index, value);
    }

    /**
     * 集合-添加一个或多个元素
     *
     * @param key
     * @param values
     * @return
     */
    public static Long setAdd(String key, Object... values) {
        return setOps.add(key, values);
    }

    /**
     * 集合-移动集合元素
     *
     * @param key
     * @param value
     * @param destKey
     * @return
     */
    public static Boolean setMove(String key, Object value, String destKey) {
        return setOps.move(key, value, destKey);
    }

    /**
     * 集合-判断是否存在集合元素
     *
     * @param key
     * @param value
     * @return
     */
    public static Boolean setIsMember(String key, Object value) {
        return setOps.isMember(key, value);
    }

    /**
     * 集合-遍历集合元素
     *
     * @param key
     * @return
     */
    public static Set<Object> setMembers(String key) {
        return setOps.members(key);
    }

    /**
     * 集合-多个集合的元素交集
     *
     * @param key
     * @param otherKey
     * @return
     */
    public static Set<Object> setIntersect(String key, String otherKey) {
        return setOps.intersect(key, otherKey);
    }

    /**
     * 集合-多个集合的元素并集
     *
     * @param key
     * @param otherKey
     * @return
     */
    public static Set<Object> setUnion(String key, String otherKey) {
        return setOps.union(key, otherKey);
    }

    /**
     * 集合-多个集合的元素差集
     *
     * @param key
     * @param otherKey
     * @return
     */
    public static Set<Object> setDifference(String key, String otherKey) {
        return setOps.difference(key, otherKey);
    }

    /**
     * 集合-移除一个或多个元素
     *
     * @param key
     * @param values
     * @return
     */
    public static Long setRemove(String key, Object... values) {
        return setOps.remove(key, values);
    }

    /**
     * 有序集合-添加
     *
     * @param key
     * @param value
     * @param score
     * @return
     */
    public static Boolean zSetAdd(String key, Object value, double score) {
        return zSetOps.add(key, value, score);
    }

    /**
     * 有序集合-按下标顺序查询
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public static Set<Object> zSetRange(String key, long start, long end) {
        return zSetOps.range(key, start, end);
    }

    /**
     * 有序集合-按下标倒序查询
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public static Set<Object> zSetReverseRange(String key, long start, long end) {
        return zSetOps.reverseRange(key, start, end);
    }

    /**
     * 有序集合-按分数顺序查询
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    public static Set<Object> zSetRangeByScore(String key, double min, double max) {
        return zSetOps.rangeByScore(key, min, max);
    }

    /**
     * 有序集合-按分数倒序查询
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    public static Set<Object> zSetReverseRangeByScore(String key, double min, double max) {
        return zSetOps.reverseRangeByScore(key, min, max);
    }

    /**
     * 有序集合-顺序查询集合元素的下标
     *
     * @param key
     * @param value
     * @return
     */
    public static Long zSetRank(String key, Object value) {
        return zSetOps.rank(key, value);
    }

    /**
     * 有序集合-倒序查询集合元素的下标
     *
     * @param key
     * @param value
     * @return
     */
    public static Long zSetReverseRank(String key, Object value) {
        return zSetOps.reverseRank(key, value);
    }

    /**
     * 有序集合-查询集合元素的分数
     *
     * @param key
     * @param value
     * @return
     */
    public static Double zSetScore(String key, Object value) {
        return zSetOps.score(key, value);
    }

    /**
     * 有序集合-批量删除
     *
     * @param key
     * @param values
     * @return
     */
    public static Long zSetRemove(String key, Object... values) {
        return zSetOps.remove(key, values);
    }

    /**
     * 有序集合-按下标批量删除
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public static Long zSetRemoveRange(String key, long start, long end) {
        return zSetOps.removeRange(key, start, end);
    }

    /**
     * 有序集合-按分数批量删除
     *
     * @param key
     * @param min
     * @param max
     * @return
     */
    public static Long zSetRemoveRangeByScore(String key, double min, double max) {
        return zSetOps.removeRangeByScore(key, min, max);
    }
}


config.properties


# spring-redis
redis.host=127.0.0.1
redis.port=8080
redis.database=0
redis.password=

# spring-redis-sentine
redis.maxTotal=
redis.maxIdle=
redis.maxWaitMillis=
redis.testOnBorrow=
redis.testOnReturn=
redis.master=
redis.sentine.1=
redis.sentine.2=
redis.sentine.3=
redis.database=
redis.password=

原文地址:https://www.cnblogs.com/lovellll/p/10213925.html