博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Redis] - redis实战
阅读量:5923 次
发布时间:2019-06-19

本文共 20782 字,大约阅读时间需要 69 分钟。

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
redisTemplate; @Resource private MyUserMapper myUserMapper; @Test public void getMyUser(){ //字符串的序列化器 redis RedisSerializer redisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(redisSerializer); //查询缓存 MyUser myUser = (MyUser) redisTemplate.opsForValue().get("myUser"); if(null == myUser){ System.out.println("当缓存没有myUser时显示."); //缓存为空,查询数据库 myUser = myUserMapper.selectByPrimaryKey(1l); //把数据库查询出来的数据放入redis redisTemplate.opsForValue().set("myUser",myUser); } System.out.println(myUser); }}
 

 

接着再次运行 因为此时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 RedisTemplate
redisTemplate(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
hmget(String key){ return redisTemplate.opsForHash().entries(key); } /** * HashSet * @param key 键 * @param map 对应多个键值 * @return true 成功 false 失败 */ public boolean hmset(String key, Map
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
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
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 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 值 * @param * @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 值 * @param * @return */ public boolean lSet(String key, List 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 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; } }}

一个控制层

@RequestMapping("selectAll")    public List selectAllPetroleumCoke(){//        List
petroleumCokes = 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,表示要走数据库了~");        List
petroleumCokes = petroleumCokeMapper.selectAllPetroleumCoke(); return petroleumCokes; }

 

 

转载于:https://www.cnblogs.com/ukzq/p/10201594.html

你可能感兴趣的文章
LINQ之路12:LINQ Operators之数据转换(Projecting)
查看>>
SQL Server:数据库角色
查看>>
多标签主界面使用TRzPageControl
查看>>
对技术的态度—CoolShell 陈皓
查看>>
分享8个超棒的基于HTML5和jQuery的开发教程
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
Http 请求处理流程
查看>>
Linux硬盘速度测试的命令
查看>>
Win10 功能大全
查看>>
前后端联调
查看>>
AC米兰3500万签波兰神锋 意甲进球数仅次C罗
查看>>
攀冰世界杯将于北京金水湖举行 78名各国好手角逐
查看>>
最最最常见的Java面试题总结——第二周
查看>>
JetBrains Rider:一款全新的基于IntelliJ和ReSharper的.NET IDE
查看>>
为你的组织设计自己的障碍消除流程
查看>>
华为敏捷/DevOps实践:如何开好站立会议
查看>>
java poi 在excel中插入图片
查看>>
PyStun安装使用
查看>>
Courier:Dropbox 基于gRPC 的 RPC 框架开发过程
查看>>
浪潮成立Inspur DevOps Lab:以应用开发和平台服务打造开发者生态
查看>>