独立开发者系列(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))  # 输出更新分数后的排行榜前三名的成员

  • 44
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大梁来了

千山万水总是情,打赏一块行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值