Redis使用示例
简介:
教程网站:https://www.redis.net.cn/tutorial/3501.html
命令参考:http://redisdoc.com/index.html
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统;
Redis多种类型的value,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。三种特殊数据类型:Bitmaps、Hyperloglog、地理位置
Jedis 是 Redis 官方首选的 Java 客户端开发包。
可作为数据库、缓存、消息订阅
方法一:springboot整合redis
1、pom依赖
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 对象池,使用redis时必须引入 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 引入 jackson 对象json转换 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
2、配置文件
application.yml
spring: redis: host: 192.168.xx.xx password: 123456 port: 6379 # 连接超时时间(记得添加单位,Duration) timeout: 10000ms # Redis默认情况下有16个分片,这里配置具体使用的分片 database: 3 lettuce: pool: # 连接池最大连接数(使用负值表示没有限制) 默认 8 max-active: 8 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 max-wait: -1ms # 连接池中的最大空闲连接 默认 8 max-idle: 8 # 连接池中的最小空闲连接 默认 0 min-idle: 0 cache: # 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配 type: redis
RedisConfig
@Configuration @AutoConfigureAfter(RedisAutoConfiguration.class) @EnableCaching public class RedisConfig { /** * 默认情况下的模板只能支持RedisTemplate<String, String>,也就是只能存入字符串,因此支持序列化 */ @Bean public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Serializable> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } /** * 配置使用注解的时候缓存配置,默认是序列化反序列化的形式,加上此配置则为 json 形式 */ @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { // 配置序列化 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build(); } }
3、实际使用 @CachePut、@Cacheable、@CacheEvict 配合对k-v使用很便利
@CachePut(value = "admin", key = "#admin.id")//与@Cacheable区别在于是否每次都调用方法,常用于更新 @Override public Admin saveOrUpdate(Admin admin) { System.out.println("执行方法体 -> 将结果缓存起来"); return admin; } //@CacheEvict(value = {"admin"}, key = "#id") //清空缓存 @Cacheable(value = {"admin"}, key = "#id") @Override public Admin getCacheable(Integer id) { System.out.println("查找缓存 -> 有就返回/没有就执行方法体 - 将结果缓存起来"); Admin admin=this.selectById(id); return admin; }
方法二 :springboot使用redisTemplat
1、配置在方法一替换config中的 redisTemplate,解决以下方法存入乱码
@Autowired private RedisTemplate redisTemplate; @Bean public RedisTemplate <String, Object> stringSerializerRedisTemplate() { RedisSerializer <String> stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); return redisTemplate; }
2、使用方法
redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作hash redisTemplate.opsForList();//操作list redisTemplate.opsForSet();//操作set redisTemplate.opsForZSet();
3、使用感想:看着好像好一些,按实取需吧
方法三:JedisPool使用方式
1、pom依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2、配置
application.yml使用以上
JedisConfig
@Configuration public class JedisConfig extends CachingConfigurerSupport { private Logger logger = LoggerFactory.getLogger(JedisConfig.class); @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.database}") private int database; @Value("${spring.redis.lettuce.pool.max-active}") private int maxActive; @Value("${spring.redis.lettuce.pool.max-idle}") private int maxIdle; @Value("${spring.redis.lettuce.pool.min-idle}") private int minIdle; @Value("${spring.redis.lettuce.pool.max-wait}") private long maxWaitMillis; /** * SpringSession 需要注意的就是redis需要2.8以上版本,然后开启事件通知,在redis配置文件里面加上 */ @Bean public JedisPool redisPoolFactory() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); jedisPoolConfig.setMaxTotal(maxActive); jedisPoolConfig.setMinIdle(minIdle); JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password, database); logger.info("JedisPool注入成功!" + "redis地址:" + host + ":" + port); return jedisPool; } }
3、工具类封装使用(通过class获取Bean)
public class RedisUtil { /** * 添加一个Map<K, field, V>集合,成功返回1,失败返回0 * * @param key * @param value * @return */ public static int setMap(String key, String field, Object value) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(value == null || key == null || "".equals(key)) { return 0; } Jedis jedis = null; try { jedis = jedisPool.getResource(); String data = JSON.toJSONString(value); Long result = jedis.hset(key, field, data); if(result == 1 || result == 0) { return 1; } else { return 0; } } finally { RedisUtil.closeJedis(jedis); } } /** * 获得一个Map<v,k>的集合 * * @param key * @return */ public static <T> T getMap(String key, String field, Class <T> clazz) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(key == null || "".equals(key)) { return null; } Jedis jedis = null; try { jedis = jedisPool.getResource(); String data = jedis.hget(key, field); if(data == null) return null; return JSON.parseObject(data, clazz); } finally { RedisUtil.closeJedis(jedis); } } /** * 返回所有的value * * @param key * @return */ public static List <String> getMapValues(String key) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(key == null || "".equals(key)) { return null; } Jedis jedis = null; try { jedis = jedisPool.getResource(); List <String> list = jedis.hvals(key); return list; } finally { RedisUtil.closeJedis(jedis); } } public static long getMapCount(String key) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(key == null || "".equals(key)) { return -1; } Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.hlen(key); } finally { RedisUtil.closeJedis(jedis); } } /** * 设置String结构key * * @param key * @param val * @return */ public static String set(String key, String val) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(key == null || "".equals(key)) { return ""; } Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.set(key, val); } finally { RedisUtil.closeJedis(jedis); } } /** * 获取String结构key * * @param key * @return */ public static <T> T get(String key, Class <T> clazz) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(key == null || "".equals(key)) { return null; } Jedis jedis = null; try { jedis = jedisPool.getResource(); String data = jedis.get(key); if(data == null) return null; return JSON.parseObject(data, clazz); } finally { RedisUtil.closeJedis(jedis); } } /** * 删除String结构key * * @param key * @return */ public static long del(String key) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); if(key == null || "".equals(key)) { return 0; } Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.del(key); } finally { RedisUtil.closeJedis(jedis); } } public static long delMapByFiled(String key, String filed) { JedisPool jedisPool = SpringUtil.getBean(JedisPool.class); Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.hdel(key, filed); } finally { RedisUtil.closeJedis(jedis); } } /** * 关闭redis * * @param jedis */ public static void closeJedis(Jedis jedis) { if(jedis != null) { jedis.close(); } } }
4、使用方法
RedisUtil.setMap("bigKey", "field"+admin.getId(), admin);//存
Admin admin= RedisUtil.getMap("bigKey", "field"+id, Admin.class);//取
5、计时器:incr/decr inceby/decrby
6、Redis事务命令:multi标记事务开始 exec 执行 multi 之后发的命令 discard 丢弃所有multi 之后发出的命令
地理位置、HyperLogLog、位图使用场景也算美滋滋
参考文档:http://redisdoc.com
浙公网安备 33010602011771号