redis 实践—— sorted set, hash set
在这里就不谈redis的安装与启动啦,网上太多人写这个了。
从最近的一个项目【钻石夺宝】说起,如果大家有玩过一元夺宝或者全名夺宝的话,大概会知道如果参与人数多的话,每隔几秒、快的话每隔一秒都会新生成一期,虽然app的流量不多,但还要先确定好如何生成期数。
第一个问题来了,那怎样生成期数呢,自己想到的方法就是根据年月日时分秒毫秒 如果是在2016年08月21日11时57分30秒123毫秒生成的话,则把这些数字拼接在一起,
20160821115730123
看样子感觉不错,但是这样子真的好吗?期数肯定要是独一无二的(原子性),第二个问题来了,如果刚好有两期同时生成呢?
不要怀疑这个可能,这样子就会造成串期了。而且涉及到钱,不可以这样子马虎。思考啊思考啊,这个时候想到redis。。。
好吧,写到这里,终于和标题有一点联系了。
老实说,一开始就只想到redis的字符串命令,incr , 看到 incr这个命令,我觉得你也知道要怎样做了,利用redis 的原子性(原子意味着操作的不可再分,要么执行要么不执行),用当前日期作为键,值得话从1递增。 比如今天是2016年8月21日 一开始是长这样子的,生成299期
201608211,201608212,201608213,201608214,···,2016082110 ,```,20160821299
但是期数越多的话,就感觉越难看了,201608211,20160821299放到一起,位数都不一样。
给你们看一个数字, 86400,会不会很熟悉,这个是一天的秒数,考虑到实际上一秒一期也至少能满足目前的需求,决定除了基本的日期,再拼接5位的期数:如2016082100001。
// js
let str = '0000' + 1
str = str.slice(str.length - 4)
console.log(str)
// 输出 00001
当然,在redis里面的话,还是1,2,3···的啦。
写到这里,正常来说应该是结束的了,但总是感觉有地方不对,如果其他同事也用了日期作为键呢,如果在这个夺宝项目中其他地方也有类似的需求呢(有的同学会说加个项目前缀不就可以了吗,虽然可以!!!),但这个时候,【sorted set】出场了,它长得帅!
语法:
ZINCRBY key increment member
以 夺宝项目【treasure】为【sorted set】的key, 以当前时间年月日为 member (成员), 每次递增1
ZINCRBY 'treasure',1,'20160821'
如果要查看最近10天的成员以及生成的期数:
ZRANGE treasure 0 10 WithScores
为什么用sorted set 的原因不是因为帅,实际上,运营人员希望拿到了期数生成最多的日期及期数,ZREVRANGE 命令就可以做到了
语法:
ZREVRANGE key start stop [WITHSCORES]
//返回有序集中指定区间内的成员,通过索引,分数从高到底
实例:
ZREVRANGE treasure 0 10 WITHSCORES
当然还有很多理由用sorted set的!!!!
sorted set 更多用法可参见:
http://www.runoob.com/redis/redis-sorted-sets.html
实际项目中,是用 hash set 实现的,在一个key上新增field(日期),然后递增field的值,今天写这文章的时候,一边查阅资料,一边在思考采取哪种redis的数据类型才是正确的,最终决定用sorted set替换原本的 hash set。
【hash set】 更适合 存储对象 比如 新增key
HMSET key field value [field value ...]
结合实际:
HMSET treasure_user:001 name "xiaochi" age "26"
HMSET treasure_user:002 name "zhaomei" age "25"
夺宝项目中还用到redis的【锁】,找个时间的话,也写一下为什么要用到锁,怎样用锁。
redis 实践—— sorted set, hash set的更多相关文章
- 节约内存:Instagram的Redis实践(转)
一.问题: 数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案: 1.通过高速服务器Cache缓存数据库数据 2.内存数据库 三.主流解Ca ...
- Redis 实践笔记
本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...
- redis字典快速映射+hash釜底抽薪+渐进式rehash | redis为什么那么快
前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...
- redis的 key string hash list set sorted set 常用的方法
redis 安装文件: http://blog.csdn.net/tangsilai/article/details/7477961 ============================== ...
- redis 与 spring整合 hash 增删改操作 list增删改操作
本人,对于以前redis的学习是非常痛苦的!近期将以前的东西捡起来.以博客的形式存储,以便于以后快速捡起来,并和广大同胞一起分享! 1):简单介绍 redis 是基于C语言开发. redis是一个ke ...
- redis的sorted set类型
1.简单描述 和set类型一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score.sorted set的实现是skip list和hash ...
- Redis 实践1- redis介绍和安装
redis是一个key-value存储系统,官方站点 http://redis.io 和memcached类似,但支持数据持久化 支持更多value类型,除了和string外,还支持hash.li ...
- Basic Tutorials of Redis(5) - Sorted Set
The last post is mainly about the unsorted set,in this post I will show you the sorted set playing a ...
- Redis中Value使用hash类型的效率是普通String的两倍
什么Redis? 点击这里 最近要开发的一个项目是分布式缓存组件,解决参数缓存高效获取的问题.参数达到了500万级别,刚刚开始了解Redis.做设计的时候考虑到Value使用哪种类型的问题? 主要面临 ...
随机推荐
- Dom深入浅出
Dom1级提供了一个Node接口,该接口将由Dom中所有节点类型(包括元素节点.文本节点.属性节点等12种)实现,而js是作为Node类型来实现的,js中的所有节点类型的继承自Node类型, 所以它们 ...
- 用Modelsim仿真QuartusII综合后网表时库的添加方法(转)
这两天做综合后仿真,发现FPGA器件库又不会加了,无奈上网找方法.说起来不好意思,很早就接触Modelsim这个仿真软件了,可是没有好好琢磨.把这两天找的方法贴出来,再加上自己的理解,以后忘了可以上博 ...
- ISE和Modelsim联合仿真(转)
相信很多人会遇到过这个问题,不知如何让ISE调用Modelsim进行仿真.我也迷糊了不少时间,查查找找,终于弄明白了,所以有了本文,和大家分享一下.我尽量讲得详细点儿,多多上图. 我的环境:Windo ...
- Oracle- PL/SQL DEV工具的使用收集
1.工具---首选项---用户界面---编辑器----定制关键词 里面可以选择关键字是否大写 2.美化代码段,点击菜单edit,然后pl/sql beautifer,快捷键:PL/SQL Develo ...
- Tomcat无法部署项目
设置项目的Jdk,compire version 增加java EE 如果有必要,现在项目根目录下放置.mymetadata文件 <?xml version="1.0" en ...
- 写了几年代码了,苦苦追寻,应该沉淀下来了,好好研究。net底层框架,以及较好的分层框架
几年码农了.像沉淀下来.写一下自己的分层框架,尤其是逻辑层和orm层.数据訪问层.一切靠自己.网上一大堆框架,可是感觉各有优缺点.于是萌生了自己写适合自己的底层訪问框架?亲们,你们有适合自己的框架么?
- BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力
1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)
[jQuery插件]用jQuery Masonry快速构建一个pinterest网站布局 时间:2011年03月21日作者:愚人码头查看次数:29,744 views评论次数:25条评论 前段时间领导 ...
- C栈stack
栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 ...
- Java Annotations: Explored & Explained--转载
原文地址:http://www.javacodegeeks.com/2012/08/java-annotations-explored-explained.html One of the many w ...