
redis数据类型及应用场景
Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1、string
简介:Strings数据类型是最常用、简单的key-value类型,普通的key/ value 存储都可以归为此类。value不仅可以是字符串,也可以是数字。因为是二进制安全的,所以你完全可以把一个图片文件的内容作为string来存储。Redis的string可以完全实现目前memcached的功能,并且效率更高。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还额外提供了下面一些操作:
1. 获取字符串长度
2. 往字符串append内容
3. 设置和获取字符串的某一段内容
4. 设置及获取字符串的某一位(bit)
5. 批量设置一系列字符串的内容
常用命令: set,get,decr,incr,mget 等。
应用场景:
1. 应用 Memcached和CKV的所有场景。字符串和数字直接存取。结构化数据需要先序列化,再set到value;相应的,get到value后需要反序列化。
2. 可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。即可以用来实现业务上的统计计数需求。也可用于实现idmaker,即生*局唯一的id。
3. 存放session key,实现一个分布式session系统。Redis的key可以方便地设置过期时间,用于实现session key的自动过期。验证skey时先根据uid路由到对应的redis,如取不到skey,则表示skey已过期,需要重新登录;如取到skey且校验通过则升级此skey的过期时间即可。
4. Set nx或SetNx,仅当key不存在时才Set。可以用来选举Master或实现分布式锁:所有Client不断尝试使用SetNx master myName抢注Master,成功的那位不断使用Expire刷新它的过期时间。如果Master挂掉了key就会失效,剩下的节点又会发生新一轮抢夺。
5. 借助redis2.6开始支持的lua脚本,可以实现更安全的2种分布式锁:一种适用于各进程竞争但总是单个进程获取锁并处理的场景。除非原处理进程挂掉因而锁过期才会被其它进程获取到锁。无须主动解锁。通过get、expire/pexpire、setnx ex| px的lua脚本实现;一种适用于各进程竞争获取锁并处理的场景。通过set nx ex| px获取锁,用完需要通过先get判断再del释放锁,否则在锁过期之前不能获取到锁。
6. GetSet, 设置新值,返回旧值。比如实现一个计数器,可以用GetSet获取计数并重置为0。
7. GetBit/SetBit/BitOp/BitCount, BitMap的玩法,比如统计今天的独立访问用户数时,每个注册用户都有一个offset,他今天进来的话就把他那个位设为1,用BitCount就可以得出今天的总人数。
8. Append/SetRange/GetRange/StrLen,对文本进行扩展、替换、截取和求长度,对特定数据格式非常有用。
实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
二、Hash
简介:Hash存的是字符串和字符串值之间的映射。Hash将对象的各个属性存入Map里,可以只读取/更新对象的某些属性。这样有些属性超长就让它一边呆着不动,另外不同的模块可以只更新自己关心的属性而不会互相并发导致覆盖冲突。
常用命令:hget,hset,hgetall 等。
应用场景:
1. 存放结构化数据,比如用户信息。在Memcached或CKV中,对于用户信息比如用户的昵称、年龄、性别、积分等,我们需要先序列化后存储为一个字符串的值,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。如下图:
2. Key是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。
3. 不过这里需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而对其它客户端的请求完全不响应,这点需要格外注意。
4. 可用来建索引。比如User对象,除了id有时还要按name来查询,可以建一个Key为user:name:id的Hash,在插入User对象时(set user:101{"id":101,"name":"calvin"}), 顺便往这个hash插入一条(hset user:name:id calvin 101),这时calvin作为hash里的一个key,值为101。按name查询的时候,用hgetuser:name:id calvin 就能从名为calvin的key里取出id。假如需要使用多种索引来查找某条数据时可以使用,一个hash key搞定,避免使用多个string key存放索引值。
5. HINCRBY同样可用于实现idmaker。相对string类型的idmaker每一个类型需要一个key,hash类型的用一个key即可。
实现方式:
Redis Hash对应Value内部实际就是一个HashMap,这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
三、List
简介:List是一个双向链表,支持双向的Pop/Push,江湖规矩一般从左端Push,右端Pop——LPush/RPop,而且还有Blocking的版本BLPop/BRPop,客户端可以阻塞在那直到有消息到来。还有RPopLPush/ BRPopLPush,弹出来返回给client的同时,把自己又推入另一个list,LLen获取列表的长度。还有按值进行的操作:LRem(按值删除元素)、LInsert(插在某个值的元素的前后),复杂度是O(N),N是List长度,因为List的值不唯一,所以要遍历全部元素,而Set只要O(log(N))。
按下标进行的操作:下标从0开始,队列从左到右算,下标为负数时则从右到左。LSet ,按下标设置元素值。LIndex,按下标返回元素。LRange,不同于POP直接弹走元素,只是返回列表内一段下标的元素,是分页的最爱。LTrim,限制List的大小,比如只保留最新的20条消息。复杂度也是O(N),其中LSet的N是List长度,LIndex的N是下标的值,LRange的N是start的值+列出元素的个数,因为是链表而不是数组,所以按下标访问其实要遍历链表,除非下标正好是队头和队尾。LTrim的N是移除元素的个数。
Android 本地数据存储 中文WORD版
本文档主要讲述的是Android 本地数据存储;对于需要跨应用程序执行期间或生命期而维护重要信息的应用程序来说,能够在移动设备上本地存储数据是一种非常关键的功能。作为一名开发人员,您经常需要存储诸如用户首选项或应用程序配置之类的信息。您还必须根据一些特征(比如访问可见性)决定是否需要涉及内部或外部存储器,或者是否需要处理更复杂的、结构化的数据类型。跟随本文学习 Android 数据存储 API,具体来讲就是首选项、SQLite 和内部及外部内存 API。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以
0
查看详情
常用命令:lpush,rpush,lpop,rpop,lrange等。
应用场景:
1. 各种列表,比如twitter的关注列表、粉丝列表等,最新消息排行、每篇文章的评论等也可以用Redis的list结构来实现。
2 消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出执行。这里的消息队列并没有ack机制,如果消费者把任务给Pop走了又没处理完就死机了怎么办?解决方法之一是加多一个sorted set,分发的时候同时发到list与sorted set,以分发时间为score,用户把任务做完了之后要用ZREM消掉sorted set里的job,并且定时从sorted set中取出超时没有完成的任务,重新放回list。另一个做法是为每个worker多加一个的list,弹出任务时改用RPopLPush,将job同时放到worker自己的list中,完成时用LREM消掉。如果集群管理(如zookeeper)发现worker已经挂掉,就将worker的list内容重新放回主list。
3 利用LRANGE可以很方便的实现list内容分页的功能。
4. 取最新N个数据的操作:LPUSH用来插入一个内容ID,作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需要的检索的数据量超越这个缓存容量,这时才需要把请求发送到数据库。
实现方式:
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
四、Set
简介:是一种无序的集合,集合中的元素没有先后顺序,不重复。将重复的元素放入Set会自动去重。
常用命令:
sadd,spop,smembers,sunion等。
应用场景:
1. 某些需要去重的列表,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
2. 可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。又比如QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大|美女|”、“土豪”、“欧巴”等等,这里也可以把每一个用户的标签都存储在一个集合之中。
3. 想要知道某些特定的注册用户或IP地址,他们到底有多少访问了某个页面,可以这样实现:SADD page:day1:
实现方式:
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
五、Sorted Set
简介:有序集合,相比set,元素放入集合时还要提供该元素的分数,可根据分数自动排序。
常用命令:
zadd,zrange,zrem,zcard等
使用场景:
1. 存放一个有序的并且不重复的集合列表,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
2. 可以做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
3. 排行榜相关:ZADD leaderboard
4. 新闻按照用户投票和时间排序,ZADD时的score = points / time^alpha, 这样用户的投票会相应的把新闻挖出来,但时间会按照一定的指数将新闻埋下去。
5. 过期项目处理:使用unix时间作为关键字,用来保持列表能够按时间排序。对current_time和time_to_live进行检索,完成查找过期项目的艰巨任务。另一项后台任务使用ZRANGE...WITHSCORES进行查询,删除过期的条目。
实现方式:
Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
更多redis知识请关注redis数据库教程栏目。
以上就是redis数据类型及应用场景的详细内容,更多请关注其它相关文章!
# 数据类型
# 应用场景
# 的是
# 遍历
# 数据存储
# redis
# 是一种
# 晋中360seo推广
# 郑州网站优化服务提供商
# 萍乡市网站优化平台
# 应用程序
# 链表
# 适用于
# 序列化
# 按下
# 是一个
# 谷歌seo优化值得做吗
# 营销案例ppt网站推广
# 如何制作好个人网站推广
# 兴义关键词seo团队
# 常州智能网站建设行业
# 龙泉品牌网站建设
# 长沙互联网推广招聘网站
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
J*aScript与HTML元素交互:图片点击事件与链接处理教程
windows10怎么设置电源按钮_windows10按下电源键功能修改
《tt语音》超级玩家开通方法
《全民k歌》音乐怎么下载到本地2025
Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】
解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用
德邦物流在线查询系统 德邦快递货物运输追踪
OTT月报 | 2025年9月智能电视大数据报告
《植物大战僵尸3》火龙草作用介绍
Go Goroutine调度与并发执行深度解析
Symfony路由参数转换器:实体存在性验证与错误处理策略
疯狂小鸟微信小游戏入口 疯狂小鸟网页版秒玩
Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法
微信客户端如何找回密码_微信客户端忘记密码找回方法
PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略
《兴业银行》注册登录方法
在Flask应用中安全高效地更新SQLAlchemy用户数据
人教版电子教材在线获取指南
百度网盘网页入口链接分享 百度网盘官网入口网页登录
青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法
《小黑盒》删除历史浏览方法
VB表达式书写规则解析
Word 2003字体大小设置方法
win11关机几秒又自己开机 Win11关机自动重启问题修复
以下哪一项是古代兵书三十六计中的计谋
PHP页面重载后变量状态保持:实现用户档案连续浏览的教程
MySQL多重关联查询:利用别名高效获取同一表的多个关联字段
淘口令快速解析技巧
哔哩哔哩在线观看入口 B站官网免费进入
yy漫画登录页面官方入口_yy漫画在线阅读网址入口
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
荣耀magicv5怎么上手测评
263企业邮箱如何设置邮件转发功能
J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
J*aScript调试技巧_性能分析与内存快照
C++二维数组动态分配方法_C++指针与数组内存布局
使用TinyButStrong生成HTML并结合Dompdf创建PDF教程
vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读
批改网官网首页登录 批改网学生用户登录入口
iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】
高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法
路由器DNS怎么设置最快 优化DNS提升上网速度教程
《米姆米姆哈》米姆获取及技能攻略
mysql如何配置从库只读_mysql从库只读设置方法
Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧
firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接
睡觉时心跳快是什么原因 夜间心悸如何应对
如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?
Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件
2020-02-13
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。