linux下redis的数据类型的使用

本文介绍Redis中的Hyperloglog和Bitmap数据类型的使用方法,包括基数统计、用户行为统计等实际应用场景。此外,还深入探讨了Redis事务的基本概念及其执行流程。

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

redis的数据类型使用

redis Hyperloglog基数统计

Hyperloglog的使用

基数是指不重复的变量值的和

127.0.0.1:6379> pfadd myset a b c d e f g h  //创建第一组元素myset
(integer) 1
127.0.0.1:6379> pfcount myset //第一字元素的基数
(integer) 8
127.0.0.1:6379> pfadd myset1 g h i j k l m n  //创建第二组元素myset1
(integer) 1
127.0.0.1:6379> pfcount myset1  //第二组元素的基数
(integer) 8
127.0.0.1:6379> pfmerge myset2 myset myset1 //将第一组和第二组元素合并为myset2
OK
127.0.0.1:6379> pfcount myset2 //查看第二组元素的基数
(integer) 14

Bitmap

位存储

统计用户信息,活跃、不活跃!登录、未登录!打卡、365打卡!两个状态的都可以使用Bitmap !
bitmaps 位图 数据结构 !都是操作二进制位来进行统计,就只有0和1两个状态!
365天=365bit 1字节=8bit 46个字节左右

测试

使用比bitmap来记录,记录周一到周二是否打卡!

127.0.0.1:6379> setbit sign 0 1 // 周一 打卡
(integer) 0
127.0.0.1:6379> setbit sign 1 1 //周二  打卡
(integer) 0
127.0.0.1:6379> setbit sign 2 0 //周三 未打卡
(integer) 0
127.0.0.1:6379> setbit sign 3 1 //周四  打卡
(integer) 0
127.0.0.1:6379> setbit sign 4 0 //周五  未打卡
(integer) 0
127.0.0.1:6379> setbit sign 5 0 //周六  未打卡
(integer) 0
127.0.0.1:6379> setbit sign 6 1 //周日  打卡
(integer) 0
127.0.0.1:6379> getbit sign 0  // 查看指定日期(周一)是否打卡
(integer) 1
127.0.0.1:6379> getbit sign 2  // 查看指定日期(周三)是否打卡
(integer) 0
127.0.0.1:6379> bitcount sign  // 统计打卡天数
(integer) 4

事务

什么是事务:ACID

1.原子性(Atomicity)

一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性

2.一致性(Consistency)

事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。

如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态

3.隔离性(Isolation)

事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:未授权读取,授权读取,可重复读取和串行化

1、读未提交(Read Uncommited),该隔离级别允许脏读取,其隔离级别最低;比如事务A和事务B同时进行,事务A在整个执行阶段,会将某数据的值从1开始一直加到10,然后进行事务提交,此时,事务B能够看到这个数据项在事务A操作过程中的所有中间值(如1变成2,2变成3等),而对这一系列的中间值的读取就是未授权读取

2、授权读取也称为已提交读(Read Commited),授权读取只允许获取已经提交的数据。比如事务A和事务B同时进行,事务A进行+1操作,此时,事务B无法看到这个数据项在事务A操作过程中的所有中间值,只能看到最终的10。另外,如果说有一个事务C,和事务A进行非常类似的操作,只是事务C是将数据项从10加到20,此时事务B也同样可以读取到20,即授权读取允许不可重复读取。

3、可重复读(Repeatable Read)

就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别禁止不可重复读取和脏读取,但是有可能出现幻影数据。所谓幻影数据,就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。在上面的例子中,可重复读取隔离级别能够保证事务B在第一次事务操作过程中,始终对数据项读取到1,但是在下一次事务操作中,即使事务B(注意,事务名字虽然相同,但是指的是另一个事务操作)采用同样的查询方式,就可能读取到10或20;

4、串行化

是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行。

4.持久化性(Durability)

一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。–即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态

redis单条命令是 保证原子性的,但是事务不保证原子性的!

Redis事务的本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!

---------------队列 set set set 执行--------------

事务没有隔离级别的概念

所有的命令在事务中,并没有直接被执行!只有在发起执行命令的时候才会执行!Exec

redis事务:

  • 开启事务(multi)
  • 命令队列(…)
  • 执行(exec)

开启事务

127.0.0.1:6379> multi //开启事务
OK
127.0.0.1:6379> set name jamison
QUEUED
127.0.0.1:6379> set age 5
QUEUED
127.0.0.1:6379> get afe
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> set score 99
QUEUED
127.0.0.1:6379> decr age
QUEUED
127.0.0.1:6379> exec //执行事务
1) OK
2) OK
3) (nil)
4) "5"
5) OK
6) (integer) 4

放弃事务

127.0.0.1:6379> multi // 事务开启
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> DISCARD // 放弃事务
OK
127.0.0.1:6379> get k2
(nil)

编译时异常(代码有问题!命令有错!)事务中所有的命令都不会被执行!

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> getset k1 // 命令有错!
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors. // 所有命令都不执行

运行时异常(1/0),

如果事务队列中存在语法性错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常!

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> decr k1 // 字符串减一出现异常
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range //抛出异常
3) OK
4) "v3"

监控!Watch

悲观锁:

  • 很悲观,认为什么时候都会出现问题,无论做什么都会加锁!

乐观锁:

  • 很乐观,认为什么时候都不会出现问题,所以都不会加锁!更行数据的时候去判断一下,在此期间是否有人修改过这个数据,version!

redis监视测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值