redis课程总结

redis使用总结

redis用于做数据缓存,可以减少对数据库的直接操作,他共有五种数据类型:string 、list、hash、set、zset。

关于集群方面的总结

redis为了提高可靠性,一台redis总是不可以很好的提供服务,万一哪天该台redis服务器宕机或者损坏,那么数据将丢失,并不能可以正常的提供服务,鉴于此,redis支持主从模式及master,这样作用是选举一台服务器作为maste提供写操作,其他slave提供读操作,这些主从模式的服务器间数据是同步的。这些服务器间是有实时通讯保证数据同步性

但是主从模式这种集群有一个严重的弊端,就是当master停止服务之后,必须手动指定新的master,这样很不友好。进而发展出了另一种模式哨兵模式即sentinel。该模式配置方式只需要在网上搜一些即可。

哨兵模式是监控master运行状况,当master不可以正常提供服务的话,就重新选取新的master。可以解决之前没有哨兵模式时候的冷启动问题。当然重新选举的时候也是需要时间的,这段时间内整个redis是不可提供服务的。同时redis横向扩容的能力也没有,不可以动态扩容,只能在设计的时候加大内存,这样导致资源的浪费。鉴于此自从redis3.0之后提出了新的集群解决方案即:redis-cluster集群解决方案。

该方案相当于多个redis哨兵模式集群,redis共有16384个hash槽,redis会自动划分不同的槽区间在不同的redis集群上,统一对外提供服务,这样就可以解决上面redis哨兵模式及主从模式的哪些弊端,如果当前redis内存不够了,可以横向增加集群,不需要重启之前的数据也不会丢失,同时在一个集群的master宕机之后,在重新选举master的时候,这段时间也只影响该集群的数据,其他集群所分配的hash槽上数据仍然可正常提供服务,这样大大提升了redis的稳健性。

关于集群配置总结:
如上所说的三种集群方式是完全不同的,可分别在网上搜相应的配置方式即可。都是在redis服务器上配置的。spring通过客户端连接的时候方式也是不同的。只需要配置即可。
配置地址参照:集群配置使用
集群发展及配置连接
在这里插入图片描述

关于redis spring使用方面

springdataredis使用,spring会提供模板类如redistemplate,但是平时建议使用StringRedisTemplate这个,因为如果使用redisTemplate,他写入的数据库的值key值出现\xac\xed\x00\x05t\x00前缀,同时如果通过redis可视化界面录入数据库的值通过redisTemplate获取的值为null。问题描述参照:rediskey问题
而使用StringRedisTemplate这个就能解决这问题,同时这两种数据是不想通的。手动录入redis数据可通过StringRedisTemplate方法进行获取。可以搜一下两者区别:粗略的区别就是redisTemplate采用的是jdk序列化,而StringRedisTemplate采用的是string的。

StringRedisTemplate常用方法

操作五种该数据类型

操作字符串: redisTemplate.opsForValue()
操作hash :redisTemplate.opsForHash()
操作list :redisTemplate.opsForList()
操作set : redisTemplate.opsForSet()
操作有序set:redisTemplate.opsForZSet()

关于key操作方法

向redis里存入数据和设置缓存时间:
stringRedisTemplate.opsForValue().set(“test”, “100”,60*10,TimeUnit.SECONDS);

清空key的过期时间
redisTemplate.persist(“test”);//待测试
查看key是否过期及获取剩余过期时间 及设置过期时间

stringRedisTemplate.expire(“red_123”,1000 , TimeUnit.MILLISECONDS);//设置过期时间

stringRedisTemplate.getExpire(“test”)//根据key获取过期时间

stringRedisTemplate.getExpire(“test”,TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位

删除key 判断该key是否存在

stringRedisTemplate.delete(“test”);//根据key删除缓存

stringRedisTemplate.hasKey(“546545”);//检查key是否存在,返回boolean值

判断指定key的set集合中是否包含某个元素

stringRedisTemplate.opsForSet().isMember(“red_123”, “1”)//根据key查看集合中是否存在指定数据

判断hash集合中是否包含某个field值为age的元素

template.opsForHash().hasKey(“redisHash”,“age”));

注意:个人理解:在使用redis的时候,操作s hash值的时候,正确的做法应当是:
应当先获取原来redis的值,然后在进行重新设置,这样好处是避免拼接修改带来的麻烦, 因为hash里面的元素filed是不可重复的。因为hash类型是不可重复的。

redis中key是不可以重复的。
关于list操作问题,直接覆盖原来的listkey即可。 使用该过程中不要对原来的key进行删除,再重新新建,

stringRedisTemplate.opsForSet().members(“red_123”);//根据key获取set集合

api操作参照地址:
https://www.e-learn.cn/content/redis/1744950

SpringBoot集成redis的RedisTemplate,也分别提供的对这些数据类型的操作。
主要有5大类:
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

String类:

1.redisTemplate.opsForValue().set(key,value)); //设置指定键的值
2.redisTemplate.opsForValue().get(key)); //获取指定键的值。
3.redisTemplate.opsForValue().get(key, start, end);//获取存储在键上的字符串的子字符串。
4.redisTemplate.opsForValue().getAndSet(key, value);//设置键的字符串值并返回其旧值。
5.redisTemplate.opsForValue().getBit(key, offset);//返回在键处存储的字符串值中偏移处的位值。
6.redisTemplate.opsForValue().multiGet(keys);//获取所有给定键的值
7.redisTemplate.opsForValue().setBit(key, offset, value);//存储在键上的字符串值中设置或清除偏移处的位
8.redisTemplate.opsForValue().set(K key, V value, long timeout, TimeUnit unit);//使用键和到期时间来设置值
9.redisTemplate.opsForValue().setIfAbsent(key, value);//设置键的值,仅当键不存在时
10.redisTemplate.opsForValue().set(K key, V value, long offset);//在指定偏移处开始的键处覆盖字符串的一部分
11.redisTemplate.opsForValue().size(key));//获取存储在键中的值的长度
12.redisTemplate.opsForValue().multiGet(Collection keys);//为多个键分别设置它们的值
13.redisTemplate.opsForValue().multiSetIfAbsent(Map<? extends K, ? extends V> m);// 为多个键分别设置它们的值,仅当键不存在时

Hash类:

1.redisTemplate.opsForHash().delete(H key, Object… hashKeys);//删除一个或多个哈希字段。
2.redisTemplate.opsForHash().hasKey(key, hashKey);//判断是否存在散列字段。
3.redisTemplate.opsForHash().get(key, hashKey);// 获取存储在指定键的哈希字段的值。
4.redisTemplate.opsForHash().entries(key);//返回map集合
5.redisTemplate.opsForHash().increment(H key, HK hashKey, long delta);//获取存储在指定键的哈希中的所有字段和值
6.redisTemplate.opsForHash().keys(key);//返回map的key集合Set
7.redisTemplate.opsForHash().size(key); //获取散列中的字段数量
8.redisTemplate.opsForHash().multiGet(H key, Collection hashKeys);//获取所有给定哈希字段的值
9.redisTemplate.opsForHash().putAll(H key, Map<? extends HK, ? extends HV> m);//为多个哈希字段分别设置它们的值
10.redisTemplate.opsForHash().put(key, hashKey, value);//设置散列字段的字符串值
11.redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);//仅当字段不存在时,才设置散列字段的值
12.redisTemplate.opsForHash().values(key);// 获取哈希中的所有值

list类:
1.redisTemplate.opsForList().leftPush(key, value);//从左向右存压栈
2.redisTemplate.opsForList().rightPush(key, value);//从右向左存压栈
3.redisTemplate.opsForList().size(key);//获取大小
4.redisTemplate.opsForList().range(key, start, end);//范围检索,根据下标,返回[start,end]的List
5.redisTemplate.opsForList().remove(key, i, value);//移除key中值为value的i个,返回删除的个数;如果没有这个元素则返回0
6.redisTemplate.opsForList().index(key, index);//检索
7.redisTemplate.opsForList().set(key, index, value);//赋值
8.redisTemplate.opsForList().trim(key, start, end);//裁剪,void,删除除了[start,end]以外的所有元素
9.redisTemplate.opsForList().rightPopAndLeftPush(String sourceKey, String destinationKey);//将源key的队列的右边的一个值删除,然后塞入目标key的队列的左边,返回这个值

set类:
1.redisTemplate.opsForSet().add(key, value); ;//如果不存在这个字符串,将字符串存入set集合,返回存入元素的个数;如果存在这个字符串就不操作,返回0;
2.redisTemplate.opsForSet().members(key);//列出key的所有set集合
3.redisTemplate.opsForSet().randomMember(key);//随机取key的一个set元素
4.redisTemplate.opsForSet().distinctRandomMembers(key,n);//随机取N次key的元素,组成一个set集合,不可以重复取出
5.redisTemplate.opsForSet().size(key);//返回set长度
6.redisTemplate.opsForSet().difference(key, otherkey);//比较key与otherKey的set集合,取出与otherKey的set集合不一样的set集合
7.redisTemplate.opsForSet().intersect(key, otherkey);//比较key与otherKey的set集合,取出二者交集,返回set交集合
8.redisTemplate.opsForSet().union(key, otherkey);比较key与otherKey的set集合,取出二者并集,返回set并集合
9.redisTemplate.opsForSet().unionAndStore(key, otherkey,destkey);比较key与otherKey的set集合,取出二者并集,并存入destKey集合,返回destKey集合个数

zset类:

关于redis使用中小步骤

之前有个疑问,就是如果高并发的操作redis,当时redis中没有缓存,需要统一去数据库中放数据,这样会造成缓存击穿这种情况,问题会导致:1数据库大量数据访问。2redis缓存中数据不一致。解决方法是需要根据业务逻辑进行处理,假如是广告缓存,那么就需要在redis缓存的时候进行加锁处理,第一次访问没值的时候进行查询数据库。 查询出来之后进行再写入缓存中。

关于指定修改list或者hash里面元素值或者删除,这种方法没有找到,并且在删除list指定位置的元素的时候会出现错误,如在获取完要删除元素位置了,此时另一个线程插入了一条数据,那么索引值就不对了。因此目前个人感觉就是用string类型保存,获取完对象之后,进行修改之后进行返回再次插入,这样岂不更好。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值