Redis深度历险记(一)基础


本篇是对"Redis深度历险"的学习与思考
Remote dictionary service

install

书中提供了docker,源代码,直接安装三种方式,其他两种我都玩过,现在说下源代码安装.
书中给出的貌似2.8版本,但是现在已经是6.0版本了,所以我执行的命令和 书中略有不同.
关于6.0的新特性还没去仔细了解,貌似加入了多线程和ACL

# 这个指令和书中不一样
git clone https://github.com/antirez/redis.git
cd redis
# 速度巨慢,我吃了饭回来才好,看来源码安装被抛弃是有道理的
make
# 书中并没有make test这一步,我是在执行make后按照提示执行了下一步,但我执行后报了两次Error,心塞
make test
cd src
./redis-server --daemonize yes

基础数据结构

书中讲到有5种,这应该是老版本的了

string

Redis的字符串是动态字符串…内部结构的实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.

如果这样的话不知道Redis能否预先制定value的capacity从而进一步减少重分配

字符串最大长度为512MB

这些指令对于其他数据结构有些也是适用的

set

引号
[qbit@manjaro src]$ ./redis-cli 
127.0.0.1:6379> set Qbit qqq
OK
127.0.0.1:6379> get Qbit
"qqq"
127.0.0.1:6379> set Qbit "qqq"
OK
127.0.0.1:6379> get Qbit
"qqq"
127.0.0.1:6379> set Qbit "qqq
Invalid argument(s)
127.0.0.1:6379> set Qbit "thiis"whatisaid"1"
Invalid argument(s)

127.0.0.1:6379> set "Qbit" m
OK
127.0.0.1:6379> get Qbit
"m"
set Qb"it m
Invalid argument(s)

通过上面例子可以看出,如果key和value被双引号引起来,和没有双引号是一个效果.如果双引号不匹配或者出现其他位置就是非法的了

exists

官网说明
判断是否存在,后面可以接上n个key,然后返回存在的key的个数,对于最普通的情况(也就是3.0之前的版本),下面是官方例子帮助理解

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

list

Redis的列表相当于Java语言里面的LinkedList

quicklist

redis内部做了一些优化,当存储数据较少的时候倾向于使用ziplist,另外这两个会结合时候,后面再具体说

rpush rpop lpop lpush

xpush时可以接多个参数,依次push,一般优先用r

lindex lrange ltrim llen

看名字大概知道什么意思,具体适用到时候再参见官网

blpop brpop

书中也介绍了list也可以作为一个简单的MQ,
需要注意的一点是消费者在pop无法获得诗句的时候需要sleep一下,这样同时减轻自己和Redis的CPU消耗
更好的方案是使用blpop brpop,其中b是blocking的意思,但是这里还有一个坑,即使Redis的服务端对于长时间空闲的链接可能断开

hash

这里面有很多x开头的操作对应了redis本身的一些操作,例如hincrby对应incr

set

zset

这是一个带排序的set,排序规则就是分数,对应的,会有各种z开头的操作,这里讲下常用的.

zrange zrevrange

分别升序和降序输出,一般后面接0 -1表示从第0个到倒数第一个都输出

zcard

相当于count

限流

滑动窗口

在这里插入图片描述
zset的一个用处是用来限流.限流是针对特定操作的限流,比如下面代码就是针对特定user_id的特定action

import time
import redis
client=redis.StrictRedis()
def is_allowed(user_id,action,period,max_count):
	#这个key的意思是对这个user_id的这个action进行限流
	key='hist:%s:%s'%(user_id,action)
	now=int(time.time()*1000)
	with client.pipeline() as pipe:
		#记录本次操作
		pipe.zadd(key,now,now)
		#移除窗口外的操作
		pipe.zremrangebyscore(key,0,now-period*1000)
		#获取窗口内数量
		pipe.zcard(key)
		#设置过期时间用于剔除冷数据
		pipe.expire(key,period+1)
		#执行
		_,_,count,_=pipe.execute()
	return count<max_count

可以看出来,如果进行不停的操作,即使由于限流导致操作不成功,也会对后期操作有负面影响.

HyperLogLog

这种数据结构涉及到三个pf开头的指令(pf表示其发明人Philippe Flajolet):pfadd,pfcount,pfmerge,其中pfcount可以跟随多个key,相当于先把他们merge在得到数

Bloom Filter

当布隆过滤器所某个值存在时,这个值可能不存在;当它说某个值不存在时,那就肯定不存在.

让我诧异的是这些bf开头的指令居然不是官方原生支持的,我使用源码安装后不支持,以后再继续研究吧.不过书中提到使用bf.reserve来控制error_rate,可以记下来.
简单说下原理,附上书中的图
在这里插入图片描述
就是会对每个key做hash(图中使用了f,g,h三个hash函数),然后把对应位图中位置设置为1,查找的时候看看对应的位图是否为1就可以了.所以位图够大才能避免碰撞,另外hash函数越多则越精确.
这里有个网站帮助计算
在这里插入图片描述

GeoHash

毫无疑问,这又涉及到一些geo开头的数据,需要提到的是删除使用了zset的zrem指令来删除
另外一个问题是对于geo的key而言,value往往很大,在集群模式下迁移会有卡顿,所以建议单独非集群部署

keys vs scan

scan提供了查找功能,但是不像keys那样会阻塞,并且支持分页.不过这里有个坑爹的特性就是返回的条数并不精准,特别是返回集为空是并不代表没有后续数据.因为其limit其实是指定的slot的数量而不是记录条数,另外它采用的是高位加法(相应的,普通加法可以理解为低位加法),如图所示
在这里插入图片描述

rehash

由于Redis采用了渐进式rehash,所以scan时要去新旧两个槽里去找

大key的查找

redis-cli -h 127.0.0.1 -p 6379 --bigkeys -i 0.1

上面的i参数是指每scan100就休眠0.1s,避免避免ops飙升触发运维监控的报警,当然这样会慢一些.所以也可以去掉.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis是一款内存数据库,性能高、支持多种数据结构、提供丰富的功能,得到了广泛的应用。但其维护操作却需要一定的技巧,开源社区中也有大量的文档、文章来讲解。其中,Redis深度历险一书介绍了Redis基础知识、高级特性、应用场景和实战案例。该书深入剖析了Redis内部的实现原理,让读者更好地理解其运行机制、调优方法和错误排查。主要内容包括Redis线程模型、内存优化、IO模型、事务、持久化、集群、性能调优、应用场景等。其中,集群方面包括Redis Cluster和Redis Sentinel两类架构的详细介绍和使用方法。性能调优方面,介绍了一些常见的性能问题和解决方案,以及使用Redis的最佳实践。对于有一定Redis使用经验的开发人员或系统工程师,这本书可以帮助他们更好地优化和管理Redis实例,也可以让他们更深入地掌握Redis相关知识。对于想学习Redis的初学者,建议还需要通过其他资料了解Redis基本概念和用法。总的来说,Redis深度历险是一本值得阅读的Redis专业书籍,它为读者提供了许多经验和实践经验,也为企业中使用Redis的团队提供了宝贵的参考资料。 ### 回答2: Redis是一款开源的高性能NoSQL数据库,近年来在企业级应用中广受欢迎。《Redis深度历险》是一本深入介绍Redis的技术书籍,由黄健宏等人撰写。 这本书详细介绍了Redis的架构、原理、数据结构、使用场景、性能优化、集群部署等方面的知识,通过系统化的学习可以在Redis的使用和优化方面获得很大的收获。 《Redis深度历险》中包含大量的实际代码示例和生产环境中的案例分析,可以帮助读者深入理解Redis的实现细节和应用场景,并快速应用到自己的实战项目中。同时,这本书也适合那些想深入了解分布式系统的架构师、程序员、运维工程师等 IT 技术人员。 此外,书中还介绍了很多Redis的新特性和应用场景,如Redis的流式计算、Redis与gRPC的结合使用等,让人们对Redis的使用和应用场景有了更深刻的认识。 总之,《Redis深度历险》是一本非常实用的Redis技术指南,对于想深入学习Redis的技术人员来说是非常必备的一本读物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值