独立开发者系列(24)——使用redis
(一)REdis的使用原理
在早期的网站的时候,如果系统本身功能不是很复杂,比如就是内部的几个用户使用,而且基本就是汇报一点简单的设备维护信息,还有日常公告。完全可以不使用数据库,直接使用json格式储存在文本文件里面。
相比于储存在MYSQL里面,读取数据的时候,优势很明显
IO操作简单:读取文本文件涉及简单的IO操作,只需在文件系统中找到并读取文件。相比之下,从MySQL数据库中读取数据需要建立连接、执行查询,并将数据传输到应用程序中。
无需数据库查询优化:文本文件的读取不需要复杂的查询优化或索引操作,而数据库读取可能需要考虑索引的使用、查询优化器的性能等。
适用于小型数据集:对于较小的数据集,直接从文本文件中读取数据可能更为简便和快速,而不涉及数据库管理的额外开销和复杂性。
所以当数据系统不复杂或者只是单纯的根据某个键获取对应值的时候,直接从文本获取优势很大。这个场景非常适合那些频繁读取但是又基本没有逻辑的数据。在之前开发的简单的一些页游的装备/套装/角色数据,基本都是直接存在XML文档里面。
当时当场景更复杂的时候,会发现明显这种读取文本的方式不够用了,比如需要读取操作日志怎么办,当数据量很大,去磁盘获取N个不同的文件效率很低怎么办,又比如单文件的数据量过大,直接导致内存溢出怎么管理。在数据库的功能和快速获取数据之间,存在一个中间地带,于是类似的缓存软件,比如redis就出现了。
为什么Redis会明显比Mysql速度要快,首先存储上redis是把数据储存在内存里面而不是硬盘上,读写速度就占据很大优势,其实本身储存的时候数据结构都是哈希结构,这个在算法上读取的效率是O(1)最快,Redis的响应方式是单线程,这样不存在锁竞争问题,内部也专门针对储存做了特别的数据结构储存设计。种种方便,让redis在处理简单的储存数据方面占据巨大速度响应优势。
种种特性,让redis有了大放异彩的机会。以下一些很典型的应用场景:
网站的初始化相关信息,每次访问,都要去读取MYSQL数据表,而这些信息一旦经过配置,基本上是属于参数类的信息,是不会改变的。这个时候,当访问量非常大的时候,需要将这部分信息直接储存在缓存里面,避免了对底层mysql频繁的读取。
网站的流程锁或者频率锁,这些锁是有失效时间的,可能3-5秒就要失效,或者频率锁,可能1秒就要失效,这种场景下,用mysql操作显然是不适合的。于是需要设置一个会自动过期的锁或者流程结束后,我们能自由掌控的锁,而这种锁就非常适合redis存储。
用户登录的中间信息,比如用户登录小程序但是没注册,而需求是必须在五分钟内注册才能算有效用户信息,这个时候,需要在用户登录的时候,储存一份相关数据信息到redis里面,然后注册的时候,根据前端传过来的token进行相互验证,失效了让用户刷新登录。
更高阶点的操作,比如各种比较流行的排行榜操作: 先将类似{zhangsan:96,lisi:97:wangwu:92,zhaoliu:88,liqi:99 }这种类似的数组更新到一个类似paixu的有序集合里面去,里面指定根据分数来进行排名,
在使用redsi自带的排序函数获取前多少名,这样每次redis里面的数据进行更新的时候,都会自动进行一次排序
redis_client.zrevrange('leaderboard', rank_start, rank_end, withscores=True)。
小结:Redis的主要作用是快速的读取储存的简单数据,规模小的时候,可以不使用,并不影响整体的业务逻辑功能,但是当业务扩大,影响到响应速度的时候,一定需要缓存派上用场。
Redis常用的命令简单用法 在一般情况下,我们是不需要手动来操作这些东西的,一般一般都是各自对应的语言封装好了相关接口,我们直接调用,比如TP框架里面,配置好了之后,直接cache() 就代表在操作redis的储存设置/获取/过期
(二)Redis常用命令操作
键操作
SET key value [EX seconds] [PX milliseconds] [NX|XX]
设置键的值,并可选地设置过期时间(秒或毫秒)、设置条件(NX:仅在键不存在时设置,XX:仅在键已存在时设置)。
GET key
获取指定键的值。
DEL key [key ...]
删除一个或多个键。
EXPIRE key seconds
设置键的过期时间(秒)。
TTL key
获取键的剩余过期时间(秒)。
PERSIST key
移除键的过期时间,使其永久有效。
字符串操作
APPEND key value
在键的值末尾追加值。
STRLEN key
获取键的值的长度。
INCR key
将键的值递增 1。
DECR key
将键的值递减 1。
列表操作
LPUSH key value [value ...]
将一个或多个值插入列表的头部。
RPUSH key value [value ...]
将一个或多个值插入列表的尾部。
LPOP key
移除并返回列表头部的一个元素。
RPOP key
移除并返回列表尾部的一个元素。
LRANGE key start stop
获取列表指定范围内的元素。
集合操作
SADD key member [member ...]
向集合中添加一个或多个成员。
SMEMBERS key
获取集合中所有的成员。
SISMEMBER key member
检查成员是否存在于集合中。
SREM key member [member ...]
从集合中移除一个或多个成员。
有序集合操作
ZADD key score member [score member ...]
向有序集合中添加一个或多个成员,同时指定它们的分数。
ZRANGE key start stop [WITHSCORES]
获取有序集合指定范围内的成员(按分数升序)。
ZREVRANGE key start stop [WITHSCORES]
获取有序集合指定范围内的成员(按分数降序)。
ZSCORE key member
获取有序集合中成员的分数。
其他常用命令
PING
测试与 Redis 服务器的连接是否存活。
FLUSHALL
删除所有数据库的所有键。
INFO
获取 Redis 服务器的信息和统计数据。
CONFIG GET/SET parameter
获取或设置 Redis 服务器的配置参数。
Redis实现排行榜的Python代码:
import redis
# 连接到Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 添加成员到排行榜
def add_to_leaderboard(member, score):
r.zadd('leaderboard', {member: score})
# 获取排行榜前N名
def get_top_scores(n):
return r.zrevrange('leaderboard', 0, n-1)
# 获取成员的排名
def get_member_rank(member):
return r.zrevrank('leaderboard', member)
# 更新成员的分数
def update_member_score(member, new_score):
r.zadd('leaderboard', {member: new_score})
# 示例操作
add_to_leaderboard('user1', 100)
add_to_leaderboard('user2', 200)
add_to_leaderboard('user3', 150)
top_scores = get_top_scores(3)
print(top_scores) # 输出排行榜前三名的成员
user_rank = get_member_rank('user2')
print(f'user2 rank: {user_rank}') # 输出user2的排名
update_member_score('user1', 130)
print(get_top_scores(3)) # 输出更新分数后的排行榜前三名的成员
原文地址:https://blog.csdn.net/weixin_43435138/article/details/140408674
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!