
Redis中咆哮位图的魅力
咆哮位图是Redis中最常用的数据结构之一,它可用于存储位集合,成为一种简单的原子性计数器。它由键和主体值组成,并提供一组bit位和高效的操作符来完成统计计数任务。
咆哮位图可以用来表示有限集合,如每天活跃用户、会员姓氏、服务实例编号等场景,它还可以提供它们之间的高效运算方式,更易于计算有交集的元素的数量。比如:
将一个集合的所有元素添加到一个咆哮位图中,可以简单有效地统计这一集合的大小:
Sadd myset 1 2 3 4 5
这就相当于有5个元素,总数为5。
另外,咆哮位图还可以用于在一系列值中查找数量,例如统计一系列元素在一定集合中出现的次数:
sadd myset 1 2 3 4 5
bitop and bitmap1 bitmap2 bitmap3
这样,就可以计算出位图1,位图2和位图3中都有的元素的数量。
在实际应用中,咆哮位图的另一个优势是可以支持大规模的海量数据计算。相比其它数据结构,位图可以更高效地使用内存,网络传输量也更小,非常适合海量类型数据中广泛使用。
用以上代码可以很轻松地实现以上例子中介绍的咆哮位图功能:
//Sets The value of bit at offset in the string value stored at key
SETBIT key offset value
//Gets the value of bit at offset in the string value stored at key
GETBIT key offset
//Perform a bitwise operation between multiple keys (contning string values) and store the result in destination


BITOP operation destination key [key …]
//Count the number of set bits (population counting) in a string
BITCOUNT key [start end]
咆哮位图可以为Redis提供很大的便利,特别是在需要高效地操作海量数据的场景中,其魅力就体现出来了。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
为什么在 Redis 实现 Lua 脚本事务
数据完整性从很多方面来看,Redis 很像当初采用 InnoDB 前的 MySQL。 而 Redis 采用了一种很合理的方式来保证数据完整性(复制,AOF 等),并且从 Redis2.6 开始引入的 Lua 脚本在功能与易用性方面为 Redis 的成长提供了很大助力。 相对来说,Lua 脚本与其他数据库中的存储过程很相似,但脚本的执行有些许不同。 在本文中最重要的一点就是一旦将脚本写入数据库,它会一直执行直到以下任一种情况出现:1. 完成所有工作,所有写操作处理完成后脚本会自动退出。 2. 脚本运行时出错并中途退出,所有以前执行的写操作都已发生,但不会再有其他写操作。 3. Redis 通过 SHUTDOWN NOSAVE 关闭时(不保存)。 4. 你附加了调试器来“使”脚本完成 #1 与 #2 (或其他手段来保证不会丢失数据)。 对于使用数据库开发软件的人,我想你也认同只有情景 #1 是最理想的。 情景 #2,#3,#4 都会导致数据异常(#2 与 #4)和/或数据丢失(#3 和 #4)。 如果你很重视数据,你应该尽可能地阻止数据异常与丢失。 这不是哲学,而是工作(This is not philosophy, this is doing your job)。 但很遗憾目前的 Redis 也帮不了你多少。 所以我决定改变这种情况。
为什么 LR 模型要使用 sigmoid 函数,背后的数学原理是什么
为什么 LR 模型要使用 sigmoid 函数Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 2Redis支持数据的备份,即master-slave模式的数据备份。 3Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis存储文章点击量,string类型和hash类型用哪种比较好
如果只是通过文章id进行点击量的存取和自增操作的话,string涉及的操作有set,get和incr。 hash涉及到的操作有hget,hset,hincr操作。 这些操作的时间复杂度都是O(1)的,所以不用太担心存取性能,反而大量string相较于hash来说要更加浪费内存,所以推荐使用hash。 一次查询多个文章id的话,hmget相对于mget也要有优势(例如Jedis客户端分片,多个节点的话,不同的key可能存放在不同的节点中,无法直接用mget,只能用管道查询)。 不过如果只是以上这些操作的话,不明白题主为什么要把访问量单独存储到一个hash中,完全可以通过存成以文章为主体的结构,例如:key = article:1fields = like_count, view_count, comment_countvalues = 10, 10, 10如果真的必须将所有访问量存放在同一个hash的话,有可能是为了方便持久化到数据库。 也就是先通过redis进行自增,然后定时将数据从redis同步到MySQL中,避免mysql的并发和锁问题。 这样的话就需要知道在这一时间段哪些文章的访问量发生了改变,然后进行update的操作,才需要将访问量和文章id单独存放在hash中。 例如:key = view_count_hashfields = article:1, article:2. article:3values = 5, 10, 20这时就需要想办法避免在fields比较多的时候,hkeys占用较长的时间,可以通过将用户id取模分片,存储在不同的hash中,或是减少同步的间隔时间,并在间隔后删掉对应的fields。 如果题主不需要这样做的话,还是建议分开存放在以文章为主体的结构中。
发表评论