在这里就不谈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的更多相关文章

  1. 节约内存:Instagram的Redis实践(转)

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求. 二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库 三.主流解Ca ...

  2. Redis 实践笔记

    本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...

  3. redis字典快速映射+hash釜底抽薪+渐进式rehash | redis为什么那么快

    前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...

  4. redis的 key string hash list set sorted set 常用的方法

    redis 安装文件:  http://blog.csdn.net/tangsilai/article/details/7477961 ==============================   ...

  5. redis 与 spring整合 hash 增删改操作 list增删改操作

    本人,对于以前redis的学习是非常痛苦的!近期将以前的东西捡起来.以博客的形式存储,以便于以后快速捡起来,并和广大同胞一起分享! 1):简单介绍 redis 是基于C语言开发. redis是一个ke ...

  6. redis的sorted set类型

    1.简单描述 和set类型一样,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score.sorted set的实现是skip list和hash ...

  7. Redis 实践1- redis介绍和安装

    redis是一个key-value存储系统,官方站点 http://redis.io   和memcached类似,但支持数据持久化 支持更多value类型,除了和string外,还支持hash.li ...

  8. 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 ...

  9. Redis中Value使用hash类型的效率是普通String的两倍

    什么Redis? 点击这里 最近要开发的一个项目是分布式缓存组件,解决参数缓存高效获取的问题.参数达到了500万级别,刚刚开始了解Redis.做设计的时候考虑到Value使用哪种类型的问题? 主要面临 ...

随机推荐

  1. C#中提供的精准测试程序运行时间的类Stopwatch

    C#中提供的精准测试程序运行时间的类Stopwatch http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html 在需要对程序的执 ...

  2. Serializable在C#中的作用.net中的对象序列化 (转)

    序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...

  3. SliderSkin

    <?xml version="1.0" encoding="utf-8"?> <s:Skin xmlns:fx="http://ns ...

  4. 检查class排座位

    在写这篇文章之前,xxx已经写过了几篇关于改检查class主题的文章,想要了解的朋友可以去翻一下之前的文章     每日一道理 灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻.它是平凡 ...

  5. 【PAT Advanced Level】1006. Sign In and Sign Out (25)

    关键在于清空字符数组和使用scanf进行输入 #include <stdio.h> #include <string.h> #include <fstream> # ...

  6. [AngularJS] Reusable directive, require from parent controller

    Glorious Directives for Our Navigation NoteWrangler navigation has now been broken into two parts: t ...

  7. careercup-中等难度 17.9

    17.9 设计一个方法,找出任意指定单词在一本书中的出现频率. 解法: 1 单次查询 遍历这本书的每个单词,计算给定单词出现的次数.时间复杂度O(n),我们无法继续优化它,因为书中的每个单次都需要访问 ...

  8. (原)nginx 源码编译

    要在nginx上开发,所以先了解下这个是干嘛的..百度一下很多 编译源码需要的组件 1.zlib 2.pcre 3.openssl 使用ubuntu的话.可以直接使用 sudo apt-get ins ...

  9. 一、 Socket之UDP异步传输文件

    用SCOKET 发送文件是一个不太好处理的问题,网上的例子也都是很简单的,我准备写一个比较完善的例子,这个就算是开始吧,以后的都会在这个例子的基础上进行修改,准备实现多线程传输.断点传输和文件传输的完 ...

  10. Mechanism of Loading Resources

    Mechanism of Loading Resources 1. Distributed strategy 1.1. Developer guilde 1.2. Notes 2. Centraliz ...