`
JokerT
  • 浏览: 22958 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

redis的list 功能实践

 
阅读更多

 

redis特点是单线程复用IO,支持list,set,sorted set,hash等众多数据结构,线程安全。
最近是用list做了一个商品交易记录的承载。需要显示给用户最近一个月的交易记录,且每个商品显示不超过750条。
原有实现:MySql+memcached。由于交易记录的即时性,缓存不宜太久,所以很容易把memcache击穿,mysql查询压力山大,对于交易记录太大的商品甚至出现超时错误。所以,需要改进。
分析一下这个场景,需要保存最近一个月的交易记录,而且只是提供最多750条的显示,因此对每个商品来说,这个记录数量是一定的。从数据存取角度来看,这是一个需要不断添加数据,查询方式基本固定的场景。由于可以保持列表长度在控制范围,因此考虑应用redis的list作为存储的主力。
这里的主要问题,一是如何存、二是如何取、三是原有数据的订正。
存。所用接口:Lpush+Ltrim。redis List是个双向列表,提供左侧和右侧的数据顺序插入功能,这里由于要把最近的记录放到列表头,采用左侧插入(Lpush接口),同时为了控制列表长度,判断长度超过一个阈值时进行截断操作Ltrim,这里有个技巧就是截断后的长度最好低于阈值一个区间,可以防止频繁的trim操作。
取。所用接口:LRange。这里有点麻烦,因为是需要查询一个时间点之前的记录,那么需要把List对象取出来进行核对,好在整个List长度是有设置上限的且是按照时间先后顺序存入的,那么可以采用二分查找的方式,这样比遍历性能要好很多。其次,还要在此基础上实现一个分页的查询。这里需要注意LRange(key,start,end)的start和end都是包括在取出列表的,跟java的list有些不同。
数据订正。这是所有数据迁移项目的必然痛点,问题关键在于如何把发生在新老存储切换时间所产生的新纪录写到新的redis存储上,其实万全的方式是吧这些新纪录写到另外一个地方,当存储切换完毕后再从这个地方回写。虽然描述的很简单,但这其中的数据一致性校验等种种问题足够你喝几壶的。考虑种种,最后还是采取了简单粗暴的方式,凌晨时执行老数据全量覆盖,期间产生的新数据丢弃,因为考虑到交易记录更多的时候是作为流水账来出现,有时是要根据数据的重要性评估投入产出比的。
整个实现之后,较原有实现性能提升了一大截,但是有几个问题在里面:1)由于rdb并非关系型数据不能实现像sql一样的条件查找,导致需要按照条件查找并做分页时,需要把整个列表都取出来再判断,造成不必要的内存损耗。但由于列表持有时间不长,暂不会造成FullGC困扰 。2)这样实现只能记一个流水账,因为内存有限。如果要查一个月前的记录目前还要查询订单。解决这个问题倒是有个好东东--Hbase,可以一直往里丢而且查询极快,奈何那是高富帅系统用的装备,维护成本很高,小网站用不起啊。。
后记:redis确实是个好东东,适合的场景可以大胆尝试一下

 

 

分享到:
评论

相关推荐

    Redis介绍及实践分享.

    同时,Redis还提供了客户端支持,以及Sharding(数据分片)和Clustering(集群)等特性,用于扩展Redis的功能以应对大规模数据。 在实际应用中,Redis已被用于Choice Hotels等企业,以应对高并发场景下的数据存储...

    redis命令实践redis命令实践redis命令实践.txt

    ### Redis命令实践详解 #### 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、高性能的键值存储系统,支持多种数据结构如字符串、哈希表、列表、集合及有序集合等。它最大的特点是将数据存储在内存...

    Redis开发运维实践指南

    本手册主要介绍Redis在开发和运维中的应用场景和最佳实践,以及高可用架构的搭建和测试。 在数据操作方面,Redis提供了丰富的命令操作,如key操作、字符串操作、列表操作、集合操作、有序集合操作和哈希操作等。...

    redis高级命令实践.zip

    本资料包主要聚焦于Redis的高级命令实践,通过"redis高级命令实践.md"文件,我们将深入探讨Redis的多种功能和优化策略。 在Redis中,除了基本的数据类型如字符串(String)、哈希(Hash)、列表(List)、集合(Set...

    Redis介绍加实践

    Redis使用键值存储数据,不仅支持简单的key-value类型的数据,还提供丰富的数据结构存储,包括但不限于list、set、zset(有序集合)和hash。这些数据结构使得Redis不仅可以用于简单的数据缓存,还可以处理复杂的数据...

    redis入门与实践

    ### Redis入门与实践 #### 一、Redis简介与NoSQL概念 Redis是一种广泛使用的开源内存数据结构存储系统,它可以作为数据库、缓存和消息中间件使用。作为一种NoSQL(Not Only SQL)数据库,Redis提供了键值对存储...

    Redis开发运维实践指南.zip_redis_redis入门指南_redis权威指南

    本指南将深入探讨Redis的开发与运维实践,帮助读者从初识到精通。 一、Redis基本概念 Redis是一个开源的、基于内存的数据结构存储系统,可以持久化到磁盘,支持多种数据结构,如字符串、哈希、列表、集合、有序集合...

    Redis深度历险:核心原理和应用实践【TALKDATA推荐】1

    《Redis深度历险:核心原理和应用实践》是一本由钱文品老师编著的专业书籍,旨在深入探讨Redis这一流行的数据存储系统的核心机制和实际应用场景。这本书不仅涵盖了Redis的基础知识,还深入到其高级特性和最佳实践,...

    redis技术实践

    ### Redis技术实践知识点详解 #### 一、概念与简介 Redis是一种高性能的键值(Key-Value)存储系统,采用ANSI C语言编写,支持多种数据结构如字符串(Strings)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)和...

    Redis命令实践.zip

    订阅/发布(Pub/Sub)功能是Redis的一个重要特性,开发者可以通过`SUBSCRIBE`和`PUBLISH`命令实现消息的发布与订阅,从而构建实时的消息传递系统。此外,Redis还支持持久化,包括RDB(快照)和AOF(append-only file...

    Redis实践C# vs2015

    4. 队列服务:Redis支持发布/订阅模式和List数据结构,可用于构建消息队列,处理异步任务。 5. 分布式锁:StackExchange.Redis库提供了一种在分布式环境中实现锁的机制,保证多线程或分布式环境下的数据一致性。 6. ...

    redis命令实践.docx

    ### Redis命令实践详解 #### 一、Redis简介 Redis是一个开源的、高性能的键值存储系统,被广泛用于实现数据库、缓存以及消息中间件等多种应用场景。它将数据存储在内存中,从而提供了非常快的读写速度。此外,...

    ServiceStack.Redis 3.9

    2. **丰富的数据类型支持**:ServiceStack.Redis支持Redis的所有基本数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这使得开发者可以方便地操作各种复杂的数据...

    redis实战,redis实践-redis-in-actions.zip

    本资源“redis实战,redis实践-redis-in-actions.zip”可能是关于 Redis 实战应用的教程或指南,旨在帮助用户深入理解 Redis 的特性和如何在实际项目中应用。 Redis 的主要特性包括: 1. **数据类型**:Redis 支持...

    redis命令实践NewLife.Redis-master.zip

    在实践中,NewLife.Redis库可能提供了方便的.NET接口来操作这些功能。 例如,使用NewLife.Redis库,你可以: - 连接Redis服务器:`var redis = RedisPool.GetClient();` - 执行字符串操作:`redis.Set("key", ...

    Redis深度历险:核心原理和应用实践

    1. 数据结构:Redis提供了丰富的数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构不仅在内存中高效存储,还支持多种操作,如添加、删除、查找和排序...

    阿里云数据库Redis版-最佳实践.pdf

    本文将深入解析这一最佳实践,包括Redis的基本功能、如何连接Redis、数据结构的使用以及优化策略。 1. Redis简介: Redis是一个开源的内存数据存储系统,常用于实现高速缓存、消息队列和实时数据存储等场景。阿里云...

    redis开发与运维实践指南

    ### Redis开发与运维实践指南 #### Introduction Redis是一款开源的键值存储系统,以其高性能、低延迟的特点在众多应用场景中发挥着重要作用。本指南旨在帮助开发者及运维人员快速掌握Redis的核心概念、常用命令...

    Redis部署向导与实践

    ### Redis部署向导与实践 #### 一、Redis概述与核心概念 Redis是一种采用C语言编写的高性能键值对存储的非关系型数据库系统。它以其极高的读写速度、丰富的数据结构支持以及灵活的应用场景而闻名,在互联网行业中...

Global site tag (gtag.js) - Google Analytics