深度剖析redis:
- String :value可以是字符串也可以是数组
计算器
统计多单位的数量(mset)
粉丝数
对象缓存存储
- List(本质是链表node):可以改写成队列、栈、阻塞队列
LPUSH list one
LRANGE list 0 -1
RPUSH list two
LPOP list
RPOP list
LINDEX list 1
LLEN list
lrem list 1 one
trim
rpoplpush mylist myotherlist
lset list 0 item
linsert mylist before "world" "other"
linsert mylist after "world" "other"
- Set(集合)
应用场景:b站用户放到一个集合中,它的粉丝也放到一个集合中。
特点:数据都是无序的;不能插入重复元素;可以支持集合和集合之间的操作。
sadd myset "hellp"
smembers myset
sismember myset hello
scard myset
rem myset hello
srandmember myset
srandmember myset 2
spop myset
smove myset myset2 "kuangshen"
sdiff key1 key2
sinter key1 key2
sunion key1 key2
- Hash(哈希)ziplist数据结构
Map集合,key-map,这个值是一个map集合!本质和String
hset myhash field1 kuangshen
hget myhash field1
hmset myhash field1 hello field2 world
hmget myhash field1 field2
hgetall myhash
hdel myhash field1
hkeys myhash
hvals myhash
hincrby mhash field3 1
hash变更的数据,尤其是用户信息,经常变动的信息。
- Zset(有序集合)
zadd myset 2 two 3 three //这里2和3是位置信息,不是key
zrangebyscore salary -inf +inf
zrangebyscore salary -inf +inf withscores
rem salary xiaohong
zcard salary
zrevrange salary 0 -1
zcount myset 1 2(最低位是1)
- Geospatial(底层原理就是Zset)
地理位置数据类型key(china:city)/value(经度、纬度、地理位置)
geoadd china:city 116.40 39.90 beijing
getpos china:city beijing chongqing
geodist china:city beijing shanghai km
georadius china:city 110 30 1000 km withcoord
georadiusbymember china:city beijing 1000 km
- Hyperloglog(基数统计)
基数(不重复元素)= 5,可以接受误差
为什么要使用Hyperloglog?
当应用情况只是为了计数时,同时内存资源比较少,且容许误差就可以使用
优点:占用内存是固定的,只需要12KB内存,从内存角度讲使用Hyperloglog首选
缺点:错误率比较高,会出现0.81%错误率
目的:为了计数(不相同元素的个数,不是为了保存元素)
pfadd mykey a b c d e
pfcount mykey
pfmerge mykey3 mykey mykey2
- Bitmaps(位存储)
应用场景:用户是否活跃,打卡等
setbit sign 0 0 | 表示星期一没打卡了 |
setbit sign 1 1 | 表示星期二打卡了 |
getbit sign 3
bitcount sign
- 事务
Redis事务的本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,顺序执行。(一次性,顺序性,排他性)
Redis事务没有隔离级别的概念,原因是:所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会被执行Exec
Redis单条命令保证原子性,但是事务不保证原子性。
Redis事务:执行到最后,直接结束了,如果在开启事务必须重写multi
开启事务(multi)
命令入队(增删改查指令进入执行队列)
执行事务(exec)
discard取消事务,进入队列的都消失
编译型异常(代码有问题,命令错误),事务所有指令都不会被执行
运行时异常(1/0 ),错误命令抛出异常,其他命令正常执行。(体现了redis事务不具备原子性,在mysql是不会出现这种情况的)
- Redis锁
悲观锁:都会上锁,效率低,
乐观锁:都不会上锁,watch记录当前key的版本号,在执行的时候会对比这个key的版本号,如果版本号不同则修改失败。exec,discard,unwatch的执行都会中断所有监视。watch money(实现乐观锁的测试结果)