Redis 学习日记

Redis

Redis 是当前互联网流行的 NoSQL(Not Only SQL)数据库。
Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。

用法

对于常用数据,第一次从数据库读出,然后就存放在NoSQL中,这样以后就无须再访问数据库,需要从NoSQL中读出即可,性能就会比数据库块的多。对于那些高并发的操作,可以在NoSQL上完成写入,等待一个时刻再批量写法数据库,这样能满足系统的性能要求。

原因

1)响应速度快
2)支持6种数据类型 。它们是字符串,哈希结构,列表,集合,排序集合和基数。
3)操作都是原子性
4)可以在如缓存,消息传递队列中使用(Redis支持“发布+订阅”的消息模式)

使用的考虑一下下面方面

1)业务数据常用吗?命中率如何?如果命中率低,就没有必要写入缓存。
2)改业务数据是读操作多,还是写操作多,如果写操作多,需要频繁写入数据库,也没有必要使用缓存。
3)业务数据大小如何?如果要存储几百兆的文件,会给缓存带来很大的压力,有必要?

Redis 对字符串操作的常用命令

这个是在springBoot2 下写的

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void testRedis(){
        // 设置 值
        String key = "springboot1";
        String key2 = "springboot2";
        stringRedisTemplate.opsForValue().set(key,"value1");
        stringRedisTemplate.opsForValue().set(key2,"value2");
        // 通过key 获取 value
        String value = stringRedisTemplate.opsForValue().get(key);
        log.info("key :"+key+"value :"+value);
        // 通过key 删除value
        stringRedisTemplate.delete(key);
        // 求长度
        Long length = stringRedisTemplate.opsForValue().size(key2);
        log.info("key 2:"+key2+" size : "+length);
        // 设置新值 并返回旧值
        String oldValue = stringRedisTemplate.opsForValue().getAndSet(key2,"new value2");
        log.info("old value :"+oldValue);
        // 获取key2 的值
        String value2 = stringRedisTemplate.opsForValue().get(key2);
        log.info(" value2 :"+value2);
        // 求子串
        String rangeValue2 = stringRedisTemplate.opsForValue().get(key2,0,3);
        log.info(" range value 2 :"+rangeValue2);
        // 追加字符串在末尾,返回新串长度
        int newLen = stringRedisTemplate.opsForValue().append(key2,"_newAdd");
        log.info("new length :"+newLen);
        String appendValue2 = stringRedisTemplate.opsForValue().get(key2);
        log.info("new value2 "+appendValue2);
        stringRedisTemplate.delete(key2);
        // 测试一下redis 的运算
        stringRedisTemplate.opsForValue().set(key,"10");
        stringRedisTemplate.opsForValue().increment(key,1);
        sout(stringRedisTemplate,key);
        stringRedisTemplate.opsForValue().increment(key,-5);
        sout(stringRedisTemplate,key);
        stringRedisTemplate.opsForValue().decrement(key,3);
        sout(stringRedisTemplate,key);
        stringRedisTemplate.opsForValue().increment(key,1.2);
        sout(stringRedisTemplate,key);
    }

    private void sout(StringRedisTemplate stringRedisTemplate ,String key){
        String value = stringRedisTemplate.opsForValue().get(key);
        log.info("--value--"+value);
}

Redis哈希数据结构和常用命令

    @Autowired
    RedisTemplate<String,Object> redisTemplate;

    @Test
    public  void testRedisHas(){
        String key = "hash_key";
        Map<String,String> map = new HashMap<>();
        map.put("file1","vaule1");
        map.put("file2","value2");
        //hash 结构设置多个键值对
        redisTemplate.opsForHash().putAll(key,map);
        //在 hash 结构中设置键值对
        redisTemplate.opsForHash().put(key,"f3","10");
        soutHash(redisTemplate,key,"file2");
        // 判断hash结构是否有这个字段
        boolean existKey = redisTemplate.opsForHash().hasKey(key,"f3");
        log.info(" 是否存在 f3 这个字段 :"+existKey);
        // 获取所有的 hash 结构的键值
        Map keyMap = redisTemplate.opsForHash().entries(key);
        log.info(keyMap.toString());
        //在某个字段增值
/*        redisTemplate.opsForHash().increment(key,"f3",10);
        soutHash(redisTemplate,key,"f3");*/
        // 获取所有的值
        List valueList = redisTemplate.opsForHash().values(key);
        log.info(valueList.toString());
        //返回所有的键
        Set keyList = redisTemplate.opsForHash().keys(key);
        log.info(keyList.toString());
        //  增加键值
        List<Object> fieldList = Arrays.asList("file1","file2");
        List valueList2 = redisTemplate.opsForHash().multiGet(key,fieldList);
        log.info(valueList2.toString());
        //修改 值 当 hash 结构中不存在对应的键,才设置值
        boolean success = redisTemplate.opsForHash().putIfAbsent(key,"f3","99");
        log.info(String.valueOf(success));
        // 删除某些字段
        long result = redisTemplate.opsForHash().delete(key,"file1","file2");
        log.info(""+result);
        // 获取所有的 hash 结构的键值
        Map keyMap2 = redisTemplate.opsForHash().entries(key);
        log.info(keyMap2.toString());
        //在使用大的 hash 结构时,需要考虑返回数据的大小,以避免返回太多的数据,引发 JVM 内存溢出或者 Redis 的性能问题。
        // 说句没有用的 :
        // 内存溢出 是对象太大,对你爱太满
        //内存泄漏 对象无法回收 , 死都不放手
}

自己写着玩,一些命令忘记了,来查阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值