Microsoft Windows [版本 10.0.17134.472](c) 2018 Microsoft Corporation。保留所有权利。C:\Users\SeeClanUkyo>f:F:\>cd redis_F:\redis_>redis-cli.exe127.0.0.1:6379> set hero gareenOK127.0.0.1:6379> get hero"gareen"127.0.0.1:6379> set google http://www.googleOK127.0.0.1:6379> append google .com(integer) 21127.0.0.1:6379> get google"http://www.google.com"127.0.0.1:6379> set visitors 0OK127.0.0.1:6379> incr visitors(integer) 1127.0.0.1:6379> incr visitors(integer) 2127.0.0.1:6379> get visitors"2"127.0.0.1:6379> incrby visitors 100(integer) 102127.0.0.1:6379> get visitors"102"127.0.0.1:6379> type googlestring127.0.0.1:6379> type visitorsstring127.0.0.1:6379> ttl google(integer) -1127.0.0.1:6379> rename google google-siteOK127.0.0.1:6379> get google(nil)127.0.0.1:6379> get google-site"http://www.google.com"127.0.0.1:6379> lpush list redis(integer) 1127.0.0.1:6379> lpush list1 hello(integer) 1127.0.0.1:6379> rpush list1 world(integer) 2127.0.0.1:6379> llen list1(integer) 2127.0.0.1:6379> lrange list1 0 31) "hello"2) "world"127.0.0.1:6379> lpop list1"hello"127.0.0.1:6379> rpop list1"world"127.0.0.1:6379> lrange list1 0 3(empty list or set)127.0.0.1:6379> hset person name jack(integer) 1127.0.0.1:6379> hset person age 20(integer) 1127.0.0.1:6379> hset person sex female(integer) 1127.0.0.1:6379> hgetall person1) "name"2) "jack"3) "age"4) "20"5) "sex"6) "female"127.0.0.1:6379> hkeys person1) "name"2) "age"3) "sex"127.0.0.1:6379> hvals person1) "jack"2) "20"3) "female"127.0.0.1:6379> hdel person(error) ERR wrong number of arguments for 'hdel' command127.0.0.1:6379> hdel name(error) ERR wrong number of arguments for 'hdel' command127.0.0.1:6379> hdel name jack(integer) 0127.0.0.1:6379> hkey pserson(error) ERR unknown command 'hkey'127.0.0.1:6379> hkeys person1) "name"2) "age"3) "sex"127.0.0.1:6379> hvals person1) "jack"2) "20"3) "female"127.0.0.1:6379> sadd myset "Hello"(integer) 1127.0.0.1:6379> sadd myset "World"(integer) 1127.0.0.1:6379> smembers myset1) "Hello"2) "World"127.0.0.1:6379> sadd myset "one"(integer) 1127.0.0.1:6379> sismember myset "one"(integer) 1127.0.0.1:6379> sismember myset "two"(integer) 0127.0.0.1:6379> zadd dbs 100 redis(integer) 1127.0.0.1:6379> zadd dbs 98 memcached(integer) 1127.0.0.1:6379> zadd dbs 99 mongodb(integer) 1127.0.0.1:6379> zadd dbs 99 leveldb(integer) 1127.0.0.1:6379> zcard dbs(integer) 4127.0.0.1:6379> zcount dbs 10 99(integer) 3127.0.0.1:6379> zrank dbs leveldb(integer) 1127.0.0.1:6379> zrank dbs other(nil)127.0.0.1:6379> zrangebyscore dbs 98 1001) "memcached"2) "leveldb"3) "mongodb"4) "redis"127.0.0.1:6379>
springboot的redis依赖
org.springframework.boot spring-boot-starter-data-redis
不再概述windows上安装redis.
linux上安装后提示:
redis的使用小记:
package com.ykmimi.job;import com.ykmimi.job.bean.MyUser;import com.ykmimi.job.bean.MyUser1;import com.ykmimi.job.mapper.MyUserMapper;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;import java.util.List;@RunWith(SpringRunner.class)@SpringBootTestpublic class DemoApplicationTests {// redis模板 @Test public void contextLoads() { MyUser user = new MyUser(1l,111l,111l,"123",111l,"t"); int insert = myUserMapper.insert(user); System.out.println(insert); } @Autowired private RedisTemplate
接着再次运行 因为此时redis中有myUser存储了,不再显示上面后箭头的输出.
需要在application.properties中:
# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379# 连接池最大连接数(使用负值表示没有限制)#spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.jedis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.jedis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.jedis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=5000
RedisConfig.java
package com.tansuo365.test1.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import java.lang.reflect.Method;@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport { /** * 生成key的策略 * @return */ @Bean public KeyGenerator keyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for(Object obj : params){ sb.append(obj.toString()); } return sb.toString(); } }; } /** * 管理缓存 * @param factory * @return */ @Bean public CacheManager cacheManager(RedisConnectionFactory factory){ RedisCacheManager cacheManager = RedisCacheManager.create(factory); return cacheManager; } /** * RedisTemplate配置 * @param factory * @return */ @Bean public RedisTemplateredisTemplate(RedisConnectionFactory factory){ StringRedisTemplate template = new StringRedisTemplate(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); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }}
实体类必须实现序列化:
@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class PetroleumCoke implements Serializable {
在启动类上加入注解:
@EnableCaching@SpringBootApplication
RedisService:
package com.tansuo365.test1.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;import org.springframework.util.CollectionUtils;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;@Servicepublic class RedisService { @Autowired private RedisTemplate redisTemplate; public void setRedisTemplate(RedisTemplate redisTemplate) { this.redisTemplate = 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 * @return */ public long incr(String key, long delta){ if(delta<0){ throw new RuntimeException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } /** * 递减 * @param key 键 * @param * @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
一个控制层
@RequestMapping("selectAll") public List selectAllPetroleumCoke(){// ListpetroleumCokes = petroleumCokeMapper.selectAllPetroleumCoke();// map.put("petroleumCokes",petroleumCokes);// return map; //字符串的序列化器 redis RedisSerializer redisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(redisSerializer); List petroleumCokes = redisService.lGet("petroleumCokes", 0, -1); System.out.println("查询缓存数据为"+petroleumCokes); if (0 == petroleumCokes.size()) { synchronized(this){ System.out.println("进入第一个if"); petroleumCokes = redisService.lGet("petroleumCokes", 0, -1); if(0 == petroleumCokes.size()){ System.out.println("第二个if显示了,表示缓存没有查到petroleumCokes."); //缓存为空,查询数据库 petroleumCokes = petroleumCokeMapper.selectAllPetroleumCoke(); //把数据库查询出来的数据放入redis redisService.lSet("petroleumCokes",petroleumCokes); } } } return petroleumCokes; }
除了上面的缓存使用还可以直接使用注解:
// @Cacheable(cacheNames = {"petroleumCokes"}) @Cacheable(value = "petroleumCokes") @RequestMapping("selectAll") public List selectAllPetroleumCoke(){ System.err.println("进入selectAll,表示要走数据库了~"); ListpetroleumCokes = petroleumCokeMapper.selectAllPetroleumCoke(); return petroleumCokes; }