Redis的基本介绍和八大类型和事务讲解

Redis

Redis是单线程的

Redis是很快的,官网表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了.

Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样是使用key-value的Memecache差

Redis为什么单线程还这么快?

  • 无趣1:高性能的服务器不一定是多线程的

  • 误区2:多线程(CPU上下文会切换!),一定比单线程效率高!

先去CPU>内存>硬盘的速度要有所了解

核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU会上下文切换:耗时的操作),对于内存系统来说,如果没有上下文切换,效率就是最高的.多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案.

Redis八大存储类型

String

APPEND haha f
get haha#得到的值是f

List

  • 列表,可以实现队列和栈

LPUSH list one#栈插入
LPUSH list two
LPUSH list three
LRANGE list 0 -1#默认获取全部list====>three,two,one
LRANGE list 0 1#获取0和1的元素,three two
RPUSH list haha#队列插入
LRANGE list 0 -1#默认获取全部list====>three,two,one,haha

Set

  • 很简单,官网查

Hash

  • 很简单,官网查

Zset

  • 有序集,可以排序

    • 排序工资

Geospatial

  • 地图

    • 输入城市名字,经度纬度,然后就可以算距离或者附近的人

Hyperloglog

  • 基数排序

PFadd mykey a b c d e f g h i j#创建第一组元素mykey
PFCOUNT mykey#得到10
PFadd mykey2 i j z x c v b n m
PFCOUNT mykey2#得到9
PFMERGE mykey3 mykey mykey2#并集
PFCOUNT mykey3#得到15
  • 网页的UV(一个人访问多次,最后还是算一次)

Bitmap

  • 位图(0和1的状态码)

setbit haha 0 1
setbit haha 1 1
setbit haha 2 0
getbit haha 2#得到0
bitcount haha 0 2#从key0到key2获取值1
bitcount haha#默认获取全部值1
  • 是否登录,是否活跃,是否打卡

  • 可以用bigcount计算有多少0和1

Redis的事务

Mybatis中的事务有四大特性,ACID:原子性,一致性,隔离性,持久性

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

multi#OK,开启事务
set k1 v1#设置
set k2 v2#设置
get k2#获取不到值,只能返回QUEUE
set k3 v3
exec#执行,之后出现之前的命令的返回值,如下
#1) OK
#2) OK
#3) "v2"
#4) OK
#每次执行之后在弄事务都需要重新写一次multi

Redis事务异常

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

multi#OK
set k1 v1
getset k2#(error) ERR wrong number of arguments for 'getset' command
set k3 v3
exec#(error) EXECABORT Transaction discarded because of previous errors.
get k2#(nil),空,全部都不执行

运行时异常(1/0一除以0),如果事务队列中存在类似异常,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常

set k1 v1
multi
incr k1#暂时不出异常,因为语法没错
set k2 v2
set k3 v3
get k3
exec#执行后,还是可以执行的,只是incr k1语句不管用
#1) (error) ERR value is not an integer or out of range
#2) OK
#3) OK
#4) "v3"

Redis监视测试(乐观锁)

正常执行成功!

set money 100
set out 0
WATCH money#监视money
MULTI
DECRBY money 20
INCRBY out 20
exec#成功,因为没有别的线程干扰,如下,转账成功
#80
#20

正常执行不成功!(测试多线程修改值,使用watch可以当做redis的乐观锁操作)

WATCH money
MULTI#事务
DECRBY money 10
INCRBY out 10
exec#在输入此命令之前,其他线程对money进行了修改,之后我们输入了exec,然后显示执行出错
UNWATCH#解锁

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值