首页 > 数据库 >Redis实战

Redis实战

时间:2024-08-23 13:50:52浏览次数:9  
标签:实战 存储 set 可以 Redis 内存 数据

Redis的String类型有什么缺点

在花费内存方面,String花费的内存很多。如果存储的是64位有符号整数的话,就是一个8字节Long类型整数。如果是包含字符的话,就会用SDS,也就是简单字符串来存储,SDS中会把存储的数据最后加一个\0,还会存储使用的buf的长度,实际分配的buf的长度。

不仅如此,有一些统一的数据,Redis还会用RedisObject来存储。它包含元数据以及指向实际数据的指针。Redis对Long做了优化,会把指针直接变成Long的值,如果SDS小于44,会把RedisObject和数据布局在一起,超过的话就不能放在一起了。

不仅如此,Redis中的全局哈希,key value next也会耗费内存,所以我们可以用hash表中的压缩列表来实现保存。把key拆分成key1 key2,压缩列表可以存储一组entry,每一个entry会存储上一个entry的长度,自身长度,编码方式,自身数据,这减少了RedisObject的内存,还减少了指针的内存。

Redis的各种场景

聚合统计

也就是求交集,并集,差集,用在网站查看总人数,新增人数,留存人数。可以用set来存储,比如set id value    set id:20240821 id value。需要注意的是set计算的时间复杂度很高,所以可以用一个从库来计算。

排序统计

例如求最新的东西,用在最新评论。list可以直接lpush,但是有一个缺点,就是如果在换页的时候正好有lpush操作,就会在第二页显示第一页的老数据。用zset就没有这个问题,可以设置权重,按照权重顺序来获取。

二值统计

只用记录0或1,可以用在签到上面,使用BitMap最好。SETBIT uid:sign:3000:202008 2 1
key是uid:sign:3000:202008,索引是2,值为1,也可以把日期作为key,用户作为索引,这样子只需要交集就可以知道谁连续登录了。虽然内存不大,但是最好也要设置过期时间

基数统计

统计网页一天净访问人数,可以用set或者hash但是使用的内存太多。HyperLogLog可以很好的完成基数统计,当集合元素数量非常多时,它计算基数所需的空间总是固定的,而且还很小。

地址统计

GEO数据类型,专门存储地址有关的数据,可以返回范围内的数据,zset没有办法保存经纬度,GEO是依靠zset作为底层结构,使用GeoHash来编码。

保存时间序列数据

在Redis中保存时间序列数据有两种方法
第一种是用hash和zset,并且用事务的方式保证原子性,但是不可以回滚,这种方法不能做聚合操作,想做聚合只能把数据返回过来,对带宽影响大。

RedisTimeSeries是专门操作时间类的,可以进行聚合操作,但是它搜索数据的时间复杂度是o(n)

带宽好,实例内存大,选第一种。
带宽差,数据量大,聚合操作多选第二种。

Redis用作消息队列

List和Streams
List有方法保证数据的有序性,也可以确保消费者是否接收到了消息,消费者也可以使用阻塞式等待List存在数据,但是数据过多,消费者处理慢的时候压力很大。

Streams可以保证有序性,可靠性的同时,支持被多个消费者读取。

 往期文章

Redis核心技术

Redis主从同步和哨兵

标签:实战,存储,set,可以,Redis,内存,数据
From: https://blog.csdn.net/2301_77664120/article/details/141428441

相关文章

  • 实战:软件架构系列之【早期微服务架构Spring Cloud Netflix中的5大组件示例】
    概叙科普文:万字细说微服务及其框架Netflix,SpringCloud,SpringCloudAlibaba梳理_微服务netflixalibaba-CSDN博客科普文:微服务之技术选型SpringCloudAlibaba_微服务架构图阿里巴巴-CSDN博客SpringCloudNetflix是SpringCloud生态系统中最早期的一个子项目,它为Spr......
  • YOLOv5实战记录 Gradio搭建Web GUI
    转自:https://blog.csdn.net/EmileJiao/article/details/137448176最终的:importtorchimportgradioasgrmodel=torch.hub.load("./","custom",path="runs/train/exp2/weights/best.pt",source="local")title="基于Gradio......
  • 小红书全能实战营:精准定位,爆款打造,实现轻松涨粉变现之旅
    课程目录:1.[开营仪式]小红书训练营盛大开幕_.mp42.[直播精讲]第一篇章:精准定位与个性化包装,打造独特IP.mp43.[直播赋能]第二篇章:选题与标题的艺术,吸引眼球的秘诀.mp44.[互动答疑·上]专场,解答你的小红书成长疑惑_.mp45.[互动答疑·下]继续坐镇,深度剖析小红书运......
  • 高效缓存策略——.NET Core 中基于 Redis 的分布式缓存实现
    引言在构建高性能的应用程序时,缓存是不可或缺的技术之一。通过缓存,我们能够显著减少数据库的压力、提升应用的响应速度。而在分布式系统中,分布式缓存则成为了处理高并发和大数据量的理想选择。本文将以Redis为例,介绍如何在.NETCore中实现分布式缓存,帮助开发者打造高效......
  • MySQL 亿级数据平滑迁移实战
    本文介绍了一次MySQL数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。一、背景预约业务是vivo游戏中心的重要业务之一。由于历史原因,预约业务数据表与其他业务数据表存储在同一个数据库中。当其他业务出现慢SQL等异常情况时,可能会直接影响......
  • Redis学习(一)
    1.通用命令keys*delk1existsk1expipek1ttlk12.String类型String类型的常见命令setk1v1 添加键值对getk1v1 获得键值对对应的值msetk1v1k2v2 一次性设置多个值mgetk1k2k3 一次性获取多个键值对的值incrk1 让k1自增incrbyk12 按步长2自增......
  • 浅谈Redis(一)
    浅谈Redis(一)文章目录浅谈Redis(一)Redis的特点Redis线程模型Redis单线程为什么快Redis持久化方案Redis缓存淘汰策略Redis缓存穿透、击穿和雪崩区别和解决方案Redis是一个开源的内存数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,比如str......
  • Springboot实战——黑马点评之缓存
    Springboot黑马点评——缓存1缓存初识与简单实现1.1根据商铺id的缓存查询基础缓存实现:考虑到有数据会同时存在于数据库和缓存中,所以:Q:数据库和缓存的数据一致性问题?A:三种缓存更新策略用来解决一致性问题1.2缓存更新策略的选择第一种:内存淘汰第二种:超时剔除第三......
  • 第四章 Python操作redis(操作案例)
    一、python对redis基本操作(1)连接redis#方式1importredisr=redis.Redis(host='127.0.0.1',port=6379)r.set('foo','Bar')print(r.get('foo'))#方式2importredispool=redis.ConnectionPool(host='127.0.0.1',po......
  • 队列操作(深入理解FreeRTOS队列之队列实战)
    文章目录一、队列的操作二、学习总结在FreeRTOS中,队列的本质是环形缓冲区。一、队列的操作1、创建队列2、写队列3、读队列详细可看此篇博客:FreeRTOS——队列(基于百问网DshanMCU-F103实现挡球板游戏改造)-CSDN博客基于链表解析队列的使用:代码示例:#include"......