作者文章

fwq

FWQ
服务器教程
使用lua+redis解决发多张券的并发问题
使用lua+redis解决发多张券的并发问题 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《使用lua+redis解决发多张券的并发问题》,聊聊并发、luaredis、多张券,我们一起来看看吧! 业务描述 这个接口的作用是给会员发多张券码。涉及到4张主体,分别是:用户,券,券码,用户领取记录。 下面是改造前的伪代码。 主要是因为查出券码那行存在并发安全问题,多个线程拿到同几个券码。以下都是基于如何让取券码变成原子的去展开。 public boolean sendCoupons(Long userId, Long couponId) { // 一堆校验 // ... // 查出券码 List couponCodes = couponCodeService.findByCouponId(couponId, num); // batchUpdateStatus是一个被@Transactional(propagation =…
2025-05-10 阅读全文 →
FWQ
服务器教程
为什么?面试都问Redis!速记
为什么?面试都问Redis!速记 收藏 珍惜时间,勤奋学习!今天给大家带来《为什么?面试都问Redis!速记》,正文内容主要涉及到数据类型、Redis等等,如果你正在学习数据库,或者是对数据库有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家! 大家好,我是哪吒。 一、同样是缓存,用map不行吗? (1)Redis可以存储几十个G的数据,Map行吗? (2)Redis的缓存可以进行本地持久化,Map行吗? (3)Redis可以作为分布式缓存,Map只能在同一个JVM中进行缓存; (4)Redis支持每秒百万级的并发,Map行吗? (5)Redis有过期机制,Map有吗? (6)Redis有丰富的API,支持非常多的应用场景,Map行吗? 二、Redis为什么是单线程的? (1)代码更清晰,处理逻辑更简单。 (2)不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题。 (3)不存在多线程切换而消耗CPU。 (4)无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善。 三、Redis真的是单线程的吗? (1)Redis6.0之前是单线程的,Redis6.0之后开始支持多线程。 (2)Redis内部使用了基于epoll的多路复用,也可以多部署几个Redis服务器解决单线程的问题。 (3)Redis主要的性能瓶颈是内存和网络。 (4)内存好说,加内存条就行了,而网络才是大麻烦,所以Redis6内存好说,加内存条就行了。 (5)而网络才是大麻烦,所以Redis6.0引入了多线程的概念。 (6)Redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。 四、Redis优缺点 1、优点 (1)Redis是KV数据库,MySQL是关系型数据库,Redis速度更快。 (2)Redis数据操作主要在内存中,MySQL主要将数据存储在硬盘,Redis速度更快。 (3)Redis同样支持持久化(RDB+AOF),Redis支持将数据异步将内存的数据持久化到硬盘上,避免Redis宕机出现数据丢失的问题。…
2025-05-10 阅读全文 →
FWQ
服务器教程
浅谈Redis的keys命令到底有多慢
浅谈Redis的keys命令到底有多慢 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《浅谈Redis的keys命令到底有多慢》,涉及到Rediskeys命令,有需要的可以收藏一下 keys命令的用法: keys pattern 查找符合正则匹配的key的列表。扫描对象是Redis服务中所有的key,想想都很慢对不对? 同时执行keys命令的同时,Redis进程将被阻塞,无法执行其他命令,假如超过了哨兵的down-after-milliseconds配置,还会进行主从切换,切换过程中,如果主节点恢复正常,还可能出现脑裂等一系列问题。 所以,生产环境中,建议直接禁用keys命令。 Keys命令的替代方案 1、scan扫描,避免阻塞 2、将需要统计的数据放入一个set中 (但是这样可能出现Big Key问题,一般数据量大就不推荐) Keys命令在Redis Cluster中是怎样执行的? 一般来说,keys命令对于集群节点来说,是不知道路由到哪个节点的,不像 get命令。在Java的Jedis客户端的JedisClusterKeyCommands类中,我们看到: public Set keys(byte[] pattern) { // 在每个节点执行keys命令 Collection > keysPerNode…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis实现实时数据同步的方法与应用实例
Redis实现实时数据同步的方法与应用实例 “纵有疾风来,人生不言弃”,这句话送给正在学习数据库的朋友们,也希望在阅读本文《Redis实现实时数据同步的方法与应用实例》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新数据库相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢! Redis是一个开源的键-值(Key-Value)存储系统,它支持多种数据结构,并提供了很多有用的功能,例如事务、脚本、LRU回收等。其中,Redis的发布/订阅机制是实现实时数据同步的重要方式之一。本文将介绍Redis的发布/订阅机制,并提供一个实例应用场景。 一、Redis的发布/订阅机制 在Redis中,发布者(Publisher)可以向任意一个频道(Channel)发送消息(Message),而订阅者(Subscriber)则可以订阅一个或多个频道,并接收频道中的消息。这种发布/订阅机制类似于电视台的广播,订阅者可以选择收听一个或多个电视台的节目,而每个电视台可以向所有收听者广播它们的节目。 下面是Redis发布/订阅机制的基本用法: 订阅一个或多个频道 SUBSCRIBE channel1 channel2 ... 发布消息到指定频道 PUBLISH channel message 其中,channel是频道名,message是待发送的消息内容。 下面是一段示例代码,它演示了如何使用Redis的发布/订阅机制: import redis # 创建 Redis 客户端 client = redis.Redis(host='localhost', port=6379) #…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis中实现查找某个值的范围
Redis中实现查找某个值的范围 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Redis中实现查找某个值的范围》,涉及到值、范围、Redis查找,有需要的可以收藏一下 本文来自Redis在Google Group上的一个问题,有一位同学发贴求助,说要解决如下的一个问题:他有一个IP范围对应地址的列表,现在需要给出一个IP的情况下,迅速的查找到这个IP在哪个范围,也就是要判断此IP的所有地。这个问题引来了Redis作者Salvatore Sanfilippo(@antirez)的回答。解答如下: 例如有下面两个范围,10-20和30-40 代码如下: A_start 10, A_end 20 B_start 30, B_end 40 我们将这两个范围的起始位置存在Redis的Sorted Sets数据结构中,基本范围起始值作为score,范围名加start和end为其value值: 代码如下: redis 127.0.0.1:6379> zadd ranges 10 A_start (integer) 1 redis…
2025-05-10 阅读全文 →
FWQ
服务器教程
redis开启和禁用登陆密码校验的方法
redis开启和禁用登陆密码校验的方法 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《redis开启和禁用登陆密码校验的方法》,涉及到登陆、Redis密码、禁用,有需要的可以收藏一下 1. 开启登陆密码校验 在redis-cli命令行工具中执行如下命令: config set requirepass yourpassword 2. 禁用登陆密码校验 同上,需要在redis-cli中执行如下命令: config set requirepass "" 以上这篇redis开启和禁用登陆密码校验的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持golang学习网。
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis的数据结构介绍:字符串、哈希、列表、集合、有序集合
Redis的数据结构介绍:字符串、哈希、列表、集合、有序集合 小伙伴们有没有觉得学习数据库很有意思?有意思就对了!今天就给大家带来《Redis的数据结构介绍:字符串、哈希、列表、集合、有序集合》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你! Redis是一个高效的开源内存中数据存储系统,支持丰富的数据结构。本文将介绍Redis支持的五种基本数据结构:字符串、哈希、列表、集合、有序集合。 字符串(string)字符串是Redis最基本的数据结构,也是最简单的。Redis的字符串可以存储任何类型的数据,如数字、二进制数据、甚至是图片、视频等。通常情况下,Redis中字符串存储的是文本形式的键值对数据。 字符串类型支持的操作包括Set、Get、Incrby等。其中,Set支持向Redis中存储一个新的字符串,Get支持从Redis中获取一个已存储的字符串,Incrby支持自增一个保存在Redis中的数字字符串。同时,字符串类型还支持一些特殊的操作,如Append、Getrange等。 哈希(hash)哈希表在数据结构中是一种常见的存储结构,它允许你通过键获取值。在Redis中,哈希表是一种string键和string值之间的映射关系,每个哈希表最多可以存储4.3亿个键值对。 哈希类型支持的操作包括Hset、Hget、Hincrby等。其中,Hset支持向Redis中存储一个新的哈希项,Hget支持从Redis中获取一个已存储的哈希项的值,Hincrby支持自增一个保存在Redis中的整数型哈希项的值。此外,哈希类型还支持一些其他操作,如Hmset、Hgetall等。 列表(list)列表是一种有序的数据结构,Redis中的列表是指一个string类型元素的有序集合,可以支持插入、删除和查询等操作。 列表类型支持的操作包括Lpush、Rpush、Lpop、Rpop等。其中,Lpush和Rpush支持在列表的头或尾部插入一个元素,Lpop和Rpop支持从列表的头或尾部删除一个元素。此外,列表类型还支持一些其他操作,如Lrange、Ltrim等。 集合(set)集合与列表不同,它是无序的。在Redis中,集合也是一种string类型元素的无序集合。集合类型支持的操作包括Sadd、Srem、Sismember、Smembers等。其中,Sadd和Srem支持向集合中添加或删除一个元素,Sismember支持查询集合中是否包含某个元素,Smembers支持获取集合中的所有元素。此外,集合类型还支持一些其他操作,如Scard、Sinter等。 有序集合(sorted set)有序集合区别于前面介绍的集合是有序的,它的每个元素都有一个相关联的分数,根据分数进行排序。在Redis中,有序集合也是一种string类型元素的有序集合。 有序集合类型支持的操作包括Zadd、Zrem、Zscore、Zrange等。其中,Zadd和Zrem支持向有序集合中添加或删除一个元素,Zscore支持查询有序集合中某个元素的分数,Zrange支持查询有序集合中在某个范围内的元素。此外,有序集合类型还支持一些其他操作,如Zrank、Zcount等。 总结以上五种基本的数据结构是Redis中常用的,它们的使用场景各不相同。通过合理选择并灵活使用这些数据结构,可以让Redis在实际应用中发挥更大的价值。 发一篇论文收2.3万!42名期刊编辑全体辞职抗议:出版社太贪婪,利润率比谷歌亚马逊都高 Redis的命名空间和过期机制的设计思路和实现方式
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis实现消息队列的方法与应用实例
Redis实现消息队列的方法与应用实例 数据库不知道大家是否熟悉?今天我将给大家介绍《Redis实现消息队列的方法与应用实例》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步! 随着互联网的快速发展,消息队列不仅在企业级应用中得到广泛应用,也在小型项目和个人开发中逐渐流行起来。Redis作为一款高性能、内存数据库,也提供了可靠、灵活的消息队列解决方案。本文将介绍Redis如何实现消息队列,以及应用实例。 一、Redis消息队列的实现方法 Redis List Redis List是一种基于链表实现的数据结构,是Redis消息队列的核心部分。可以使用LPUSH和RPUSH命令将元素添加到队列中,使用LPOP和RPOP命令将元素从队列中取出。此外,还可以使用LRANGE命令获取队列中的所有元素,支持阻塞和非阻塞两种模式。 Redis List不仅可以实现队列,还可以实现栈和双向队列。当然,也可以组合使用各种List命令实现自定义的数据结构。 Redis Pub/Sub Redis Pub/Sub是一种基于信息订阅与发布模式实现的消息队列。它可以通过PUBSUB命令进行管理。使用PUBLISH命令将消息发送到指定的频道,使用SUBSCRIBE命令订阅指定的频道。 Redis Pub/Sub不仅可以用于实现消息队列,还可以用于实现实时通信和事件驱动模型等。 Redis Lua脚本 Redis支持用Lua脚本编写自定义命令,这可以用来实现更复杂的消息队列方案。例如,可以将多个List和Pub/Sub命令组合在一起,实现自己的消息队列逻辑。 Redis Lua脚本还支持使用Redis的事务处理功能,可以确保消息队列操作的原子性。 二、Redis消息队列的应用实例 订单处理 订单处理是一个非常适合使用Redis消息队列的场景。当有用户下单时,需要将订单信息添加到队列中。订单队列可以实现一些基础功能,如订单状态的更改、订单处理的逻辑等。 在高并发的情况下,消息队列可以确保订单信息被逐一处理,避免重复处理和丢失订单信息。同时,可以通过监控工具对订单处理进程进行实时监控,保证系统的稳定性。 通知系统 通知系统是另一个适合使用Redis消息队列的场景。例如,在用户注册后,需要向用户发送一封欢迎邮件,同时也需要向管理员发送一封通知邮件。 通过将通知消息添加到消息队列中,可以确保消息最终被处理,同时避免因发送异常或网络故障等原因导致消息发送失败的情况。…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis特殊数据类型HyperLogLog基数统计算法讲解
Redis特殊数据类型HyperLogLog基数统计算法讲解 收藏 本篇文章给大家分享《Redis特殊数据类型HyperLogLog基数统计算法讲解》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 Redis HyperLogLog基数统计 HyperLogLog 是用来做基数统计的算法。 先了解下什么是基数。 比如数据集{1, 3, 5, 7, 5, 7, 8},那么这个数据集的基数集为{1, 3, 5 ,7, 8},基数(不重复元素)为5。 如果,现在需要统计一下网页的UV,那么就会涉及到去重了,这种场景就很适合用HyperLogLog。 这不就是set集合嘛?我用set来得出不重复的元素也可以呀。 没错,是可以,但是当数据量非常大的时候,你这个set是不是会占用非常大的内存呢?如果用HyperLogLog来处理就好了,因为它计算基数所需要的空间是一定的,只要12kb,就可以计算接近 2^64 个不同元素的基数。 但是注意在这个数量级下,是会存在0.81%的错误率的,所以说具体还得看业务是否可以接受这样的错误率。像上面说的统计UV的场景,这点错误率是可以忽略的。 一、pfadd 将所有元素参数添加到…
2025-05-10 阅读全文 →
FWQ
服务器教程
一文搞定Redis持久化策略(AOF)
一文搞定Redis持久化策略(AOF) 收藏 哈喽!今天心血来潮给大家带来了《一文搞定Redis持久化策略(AOF)》,想必大家应该对数据库都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到Redis、AOF、AOF日志,若是你正在学习数据库,千万别错过这篇文章~希望能帮助到你! 今天为大家介绍Redis的另一种持久化策略——AOF。 什么是AOF 男孩“一觉醒来”忘记了对女孩子的承诺,这时候女孩子把曾经海誓山盟的录音逐条播放给男孩子听,帮助他“恢复记忆”。 “男孩一觉醒来”像极了Redis宕机重启的样子,而女孩子的录音就是Redis的AOF日志。 AOF(Append Only  File)以文本的形式(文本格式由Redis自定义,后文会讲到),通过将所有对数据库的写入命令记录到AOF文件中,达到记录数据库状态的目的。 注意:AOF文件只会记录Redis的写操作命令,因为读命令对数据的恢复没有任何意义。 Redis默认并未开启AOF功能,redis.conf配置文件中,关于AOF的相关配置如下:  # 是否开启AOF功能(开启:yes 关闭:no)  appendonly yes  # 生成的AOF文件名称  appendfilename 6379.aof  # AOF写回策略  appendfsync everysec  # 当前AOF文件大小和最后一次重写后的大小之间的比率>=指定的增长百分比则进行重写  # 如100代表当前AOF文件大小是上次重写的两倍时候才重写  auto-aof-rewrite-percentage 100  # AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。  auto-aof-rewrite-min-size 64mb AOF日志格式 下面我们通过一个例子,看一下AOF机制是如何保存我们的操作日志的,我们对Redis进行如下操作。  127.0.0.1:6379[3]> RPUSH list 1 2 3 4 5  (integer) 5  127.0.0.1:6379[3]> LRANGE list 0 -1 …
2025-05-10 阅读全文 →