redis应用详解

本文详细介绍了Redis的五种主要数据结构:String、Hash、List、Set和Zset的使用方法,以及Redis在缓存、计数器、队列、位操作、分布式锁、最新列表和排行榜等场景的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、redis的5种数据结构类型

String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、

1.1 、String(字符串)

常用方法:

  • get:获取存储在给定key值中的value值
  • set:设置给定key值中的value值
  • del:删除给定key值中的value值
    ValueOperations<String, String> valueOperations = redisTemplate
                    .opsForValue();
            valueOperations.set("stringKey", "stringValue");
            logger.info("字符串set操作后,根据key值:stringKey,获取的value值为"
                    + valueOperations.get("stringKey"));
            valueOperations.getOperations().delete("stringKey");
            logger.info("字符串delete操作后,根据key值:stringKey,获取的value值为"
                    + valueOperations.get("stringKey"));  

调用打印结果

 

1.2、Hash(哈希)

 

常用方法:

  • Hset:在散列表里关联起给定的键值对
  • Hget:获取给定的散列键的值
  • Hgetall:获取散列包含的所有键值对
  • Hdel:如果给定键存在与散列表里面,则删除这个键
//操作hash
        HashOperations<String, String, String> hashOperations = redisTemplate
                .opsForHash();
        hashOperations.put("hashKey", "hashKey1", "hashValue1");
        hashOperations.put("hashKey", "hashKey2", "hashValue2");
        hashOperations.put("hashKey", "hashKey3", "hashValue3");
        logger.info("哈希put操作后,根据key值:hashKey,获取的所有hashKey值为"
                + hashOperations.keys("hashKey"));
        logger.info("哈希put操作后,根据key值:hashKey,获取的所有hashValue值为"
                + hashOperations.values("hashKey"));
        logger.info("哈希put操作后,根据key值:hashKey,获取的hashValue值为"
                + hashOperations.get("hashKey", "hashKey1"));
        hashOperations.getOperations().delete("hashKey");
        logger.info("哈希delete操作后,根据key值:hashKey,获取的hashValue值为"
                + hashOperations.get("hashKey", "hashKey1"));

调用打印结果

 

 

 

 

 

 1.3、 List(列表)

常用方法:

  • Rpush:将给定值推入列表的右端
  • Lrange:获取列表在给定范围上的所有值
  • Lindex:获取列表在给定位置上的单个元素
  • Lpop:从列表左端弹出一个值,并返回被弹出的值

 

 //操作list
        ListOperations<String, String> listOperations = redisTemplate
                .opsForList();
        listOperations.leftPush("listKey", "listValue1");
        listOperations.leftPush("listKey", "listValue2");
        listOperations.rightPush("listKey", "listValue3");
        listOperations.rightPush("listKey", "listValue3");
        logger.info("list插入操作后,根据key值获取所有元素"
                + listOperations.range("listKey", 0, 10));
        listOperations.getOperations().delete("listKey");
        logger.info("list删除操作后,根据key值获取所有元素"
                + listOperations.range("listKey", 0, 10));

 

 调用打印结果

 

 1.4 Set(集合)

常用方法:

  • Sadd:将给定元素添加到集合
  • Smembers:返回集合中包含的所有元素
  • Sismember:检查元素是否存在于集合中
  • Srem:如果给定元素存在与集合中,那么移除出这个元素
 //操作set(无序集合)
        SetOperations<String, String> setOperations = redisTemplate.opsForSet();
        setOperations.add("setKey", "setValue1", "setValue2", "setValue3",
                "setValue4");
        logger.info("根据key值获取所有元素" + setOperations.members("setKey"));
        logger.info("检查元素setValue1是否存在于集合中" + setOperations.isMember("setKey", "setValue1"));
        logger.info("检查元素setValue是否存在于集合中" + setOperations.isMember("setKey", "setValue"));

调用打印结果

 

 1.5 Zset(集合)

常用方法:

Zadd:将一个带有给定分值的成员添加到有序集合里面

Zrange:根据元素在有序排列中所处的位置,从有序集合里面获取多个元素

ZrangeByScore:获取有序集合在给定分值范围内的所有元素

Zrem:如果给定成员存在与有序集合,那么一出这个成员

 

2.redis的应用场景 

原文链接地址:https://www.cnblogs.com/shoshana-kong/p/9004104.html

一:缓存——热数据(老平台后去地市名称)(参考链接:https://blog.csdn.net/qq_24598601/article/details/89281673

热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外,内存中的数据也提供了AOF和RDB等持久化机制可以选择,要冷、热的还是忽冷忽热的都可选。

结合具体应用需要注意一下:很多人用spring的AOP来构建redis缓存的自动生产和清除,过程可能如下:

  • Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis

  • update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据

上面这种操作,如果并发量很小的情况下基本没问题,但是高并发的情况请注意下面场景:

为了update先删掉了redis中的该数据,这时候另一个线程执行查询,发现redis中没有,瞬间执行了查询SQL,并且插入到redis中一条数据,回到刚才那个update语句,这个悲催的线程压根不知道刚才那个该死的select线程犯了一个弥天大错!于是这个redis中的错误数据就永远的存在了下去,直到下一个update或者delete。

二:计数器

诸如统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能!爽。

命令:INCRBY

当然爽完了,别忘记持久化,毕竟是redis只是存了内存!


三:队列

  • 相当于消息系统,ActiveMQ,RocketMQ等工具类似,但是个人觉得简单用一下还行,如果对于数据一致性要求高的话还是用RocketMQ等专业系统。

  • 由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务

  • 队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用


四:位操作(大数据处理)

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。

想想一下腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多,腾讯光这个得多花多少钱。。)好吧。这里要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。用到的命令是:setbit、getbit、bitcount


五:分布式锁与单线程机制

  • 验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request Ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交

  • 秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”

  • 全局增量ID生成,类似“秒杀”


六:最新列表

例如新闻列表页面最新的新闻列表,如果总数量很大的情况下,尽量不要使用select a from A limit 10这种low货,尝试redis的 LPUSH命令构建List,一个个顺序都塞进去就可以啦。不过万一内存清掉了咋办?也简单,查询不到存储key的话,用mysql查询并且初始化一个List到redis中就好了。


七:排行榜

谁得分高谁排名往上。命令:ZADD(有续集,sorted set)

最近在研究股票,发现量化交易是个非常好的办法,通过臆想出来规律,用程序对历史数据进行验证,来判断这个臆想出来的规律是否有效,这玩意真牛!有没有哪位玩这个的给我留个言,交流一下呗。

 

转载于:https://www.cnblogs.com/lchzlp/p/11518590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值