精华内容
下载资源
问答
  • 查看统计信息Mrds:6379> info在cli下执行info。info Replication只看其中一部分...# Serverredis_version:2.8.19 ###redis版本号redis_git_sha1:00000000 ###git SHA1redis_git_dirty:0 ###git dirty flagredis_...

    查看统计信息Mrds:6379> info

    在cli下执行info。info Replication

    只看其中一部分。config resetstat

    重新统计。# Server

    redis_version:2.8.19 ###redis版本号

    redis_git_sha1:00000000 ###git SHA1

    redis_git_dirty:0 ###git dirty flag

    redis_build_id:78796c63e58b72dc

    redis_mode:standalone ###redis运行模式

    os:Linux 2.6.32-431.el6.x86_64 x86_64 ###os版本号

    arch_bits:64 ###64位架构

    multiplexing_api:epoll ###调用epoll算法

    gcc_version:4.4.7 ###gcc版本号

    process_id:25899 ###服务器进程PID

    run_id:eae356ac1098c13b68f2b00fd7e1c9f93b1c6a2c ###Redis的随机标识符(用于sentinel和集群)

    tcp_port:6379 ###Redis监听的端口号

    uptime_in_seconds:6419 ###Redis运行时长(s为单位)

    uptime_in_days:0 ###Redis运行时长(天为单位)

    hz:10

    lru_clock:10737922 ###以分钟为单位的自增时钟,用于LRU管理

    config_file:/etc/redis/redis.conf ###redis配置文件

    # Clients

    connected_clients:1 ###已连接客户端的数量(不包括通过从属服务器连接的客户端)这个参数也要一定关注,有飙升和明显下降时都会有问题。即使不操作

    client_longest_output_list:0 ###当前连接的客户端中最长的输出列表

    client_biggest_input_buf:0 ###当前连接的客户端中最大的。输出缓存

    blocked_clients:0 ###正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 需监控

    # Memory

    used_memory:2281560 ###由 Redis 分配器分配的内存总量,以字节(byte)为单位

    used_memory_human:2.18M ###以更友好的格式输出redis占用的内存

    used_memory_rss:2699264 ###从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致,包含了used_memory和内存碎片。

    used_memory_peak:22141272 ### Redis 的内存消耗峰值(以字节为单位)

    used_memory_peak_human:21.12M ###以更友好的格式输出redis峰值内存占用

    used_memory_lua:35840 ###LUA引擎所使用的内存大小

    mem_fragmentation_ratio:1.18 ### =used_memory_rss /used_memory 这两个参数都包含保存用户k-v数据的内存和redis内部不同数据结构需要占用的内存,并且RSS指的是包含操作系统给redis实例分配的内存,这里面还包含不连续分配所带来的开销。因此在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿。当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。可以说这个值大于1.5或者小于1都是有问题的。当大于1.5的时候需要择机进行服务器重启。当小于1的时候需要对redis进行数据清理

    mem_allocator:jemalloc-3.6.0

    # Persistence

    loading:0 ###记录服务器是否正在载入持久化文件,1为正在加载

    rdb_changes_since_last_save:0 ###距离最近一次成功创建持久化文件之后,产生了多少次修改数据集的操作

    rdb_bgsave_in_progress:0 ###记录了服务器是否正在创建 RDB 文件,1为正在进行

    rdb_last_save_time:1420023749 ###最近一次成功创建 RDB 文件的 UNIX 时间戳

    rdb_last_bgsave_status:ok ###最近一次创建 RDB 文件的结果是成功还是失败,失败标识为err,这个时候写入redis 的操作可能会停止,因为默认stop-writes-on-bgsave-error是开启的,这个时候如果需要尽快恢复写操作,可以手工将这个选项设置为no。

    rdb_last_bgsave_time_sec:0 ###最近一次创建 RDB 文件耗费的秒数

    rdb_current_bgsave_time_sec:-1 ###如果服务器正在创建 RDB 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数

    aof_enabled:1 ###AOF 是否处于打开状态,1为启用

    aof_rewrite_in_progress:0 ###服务器是否正在创建 AOF 文件

    aof_rewrite_scheduled:0 ###RDB 文件创建完毕之后,是否需要执行预约的 AOF 重写操作(因为在RDB时aof的rewrite会被阻塞一直到RDB结束)

    aof_last_rewrite_time_sec:-1 ###最近一次创建 AOF 文件耗费的时长

    aof_current_rewrite_time_sec:-1 ###如果服务器正在创建 AOF 文件,那么这个域记录的就是当前的创建操作已经耗费的秒数

    aof_last_bgrewrite_status:ok ###最近一次创建 AOF 文件的结果是成功还是失败

    aof_last_write_status:ok

    aof_current_size:176265 ###AOF 文件目前的大小

    aof_base_size:176265 ###服务器启动时或者 AOF 重写最近一次执行之后,AOF 文件的大小

    aof_pending_rewrite:0 ###是否有 AOF 重写操作在等待 RDB 文件创建完毕之后执行

    aof_buffer_length:0 ###AOF 缓冲区的大小

    aof_rewrite_buffer_length:0 ###AOF 重写缓冲区的大小

    aof_pending_bio_fsync:0 ###后台 I/O 队列里面,等待执行的 fsync 调用数量

    aof_delayed_fsync:0###被延迟的 fsync 调用数量

    loading_start_time:1441769386 loading启动时间戳

    loading_total_bytes:1787767808 loading需要加载数据量

    loading_loaded_bytes:1587418182 已经加载的数据量

    loading_loaded_perc:88.79 加载百分比

    loading_eta_seconds:7 剩余时间

    # Stats

    total_connections_received:8466 ###服务器已接受的连接请求数量,注意这是个累计值。

    total_commands_processed:900668 ###服务器已执行的命令数量,这个数值需要持续监控,如果在一段时间内出现大范围波动说明系统要么出现大量请求,要么出现执行缓慢的操作。

    instantaneous_ops_per_sec:1 ###服务器每秒钟执行的命令数量

    total_net_input_bytes:82724170

    total_net_output_bytes:39509080

    instantaneous_input_kbps:0.07

    instantaneous_output_kbps:0.02

    rejected_connections:0 ###因为最大客户端数量限制而被拒绝的连接请求数量

    sync_full:2

    sync_partial_ok:0

    sync_partial_err:0

    expired_keys:0 ###因为过期而被自动删除的数据库键数量

    evicted_keys:0 ###因为最大内存容量限制而被驱逐(evict)的键数量。这个数值如果不是0则说明maxmemory被触发,并且 evicted_keys一直大于0,则系统的latency增加,此时可以临时提高最大内存,但这只是临时措施,需要从应用着手分析。

    keyspace_hits:0 ###查找数据库键成功的次数。可以计算命中率

    keyspace_misses:500000 ###查找数据库键失败的次数。

    pubsub_channels:0 ###目前被订阅的频道数量

    pubsub_patterns:0 ###目前被订阅的模式数量

    latest_fork_usec:402 ###最近一次 fork() 操作耗费的毫秒数

    # Replication

    role:master ###如果当前服务器没有在复制任何其他服务器,那么这个域的值就是 master ;否则的话,这个域的值就是 slave 。注意,在创建复制链的时候,一个从服务器也可能是另一个服务器的主服务器

    connected_slaves:2 ###2个slaves

    slave0:ip=192.168.65.130,port=6379,state=online,offset=1639,lag=1

    slave1:ip=192.168.65.129,port=6379,state=online,offset=1639,lag=0

    master_repl_offset:1639

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:2

    repl_backlog_histlen:1638

    # CPU

    used_cpu_sys:41.87 ###Redis 服务器耗费的系统 CPU

    used_cpu_user:17.82 ###Redis 服务器耗费的用户 CPU

    used_cpu_sys_children:0.01 ###后台进程耗费的系统 CPU

    used_cpu_user_children:0.01 ###后台进程耗费的用户 CPU

    # Keyspace

    db0:keys=3101,expires=0,avg_ttl=0 ###keyspace 部分记录了数据库相关的统计信息,比如数据库的键数量、数据库过期键数量等

    展开全文
  • 而使用 HyperLogLog 虽然能够有效地减少统计在线用户所需的内存, 但是它却没办法准确地记录具体的在线用户名单。那么是否存在一种既能够获得在线用户名单, 又可以尽量减少内存消耗的方法存在呢? 这种方法的确存在...

    方案 4 :使用位图(bitmap)

    回顾上面介绍的三个方案, 我们可以得出以上结论:

    使用有序集合或者集合能够储存具体的在线用户名单, 但是却需要消耗大量的内存;

    而使用 HyperLogLog 虽然能够有效地减少统计在线用户所需的内存, 但是它却没办法准确地记录具体的在线用户名单。

    那么是否存在一种既能够获得在线用户名单, 又可以尽量减少内存消耗的方法存在呢? 这种方法的确存在 —— 使用 Redis 的位图就可以办到。

    Redis 的位图就是一个由二进制位组成的数组, 通过将数组中的每个二进制位与用户 ID 进行一一对应, 我们可以使用位图去记录每个用户是否在线。

    当一个用户上线时, 我们就使用 SETBIT 命令, 将这个用户对应的二进制位设置为 1 :

    # 此处的 user_id 必须为数字,因为它会被用作索引

    SETBIT "online_users" 1

    通过使用 GETBIT 命令去检查一个二进制位的值是否为 1 , 我们可以知道指定的用户是否在线:

    GETBIT "online_users"

    而通过 BITCOUNT 命令, 我们可以统计出位图中有多少个二进制位被设置成了 1 , 也即是有多少个用户在线:

    BITCOUNT "online_users"

    跟集合一样, 用户也能够对多个位图进行聚合计算 —— 通过 BITOP 命令, 用户可以对一个或多个位图执行逻辑并、逻辑或、逻辑异或或者逻辑非操作:

    # 计算出 7 天都在线的用户

    BITOP "AND" "7_days_both_online_users" "day_1_online_users" "day_2_online_users" ... "day_7_online_users"

    # 计算出 7 在的在线用户总人数

    BITOP "OR" "7_days_total_online_users" "day_1_online_users" "day_2_online_users" ... "day_7_online_users"

    # 计算出两天当中只有其中一天在线的用户

    BITOP "XOR" "only_one_day_online" "day_1_online_users" "day_2_online_users"

    HyperLogLog 方案记录一个用户是否在线需要花费 1 个二进制位, 对于用户数为 100 万的网站来说, 使用这一方案只需要耗费 125 KB 内存, 而对于用户数为 1000 万的网站来说, 使用这一方案也只需要花费 1.25 MB 内存。

    虽然位图节约内存的效果不及 HyperLogLog 那么显著, 但是使用位图可以准确地判断一个用户是否上线, 并且能够像集合和有序集合一样, 对在线用户名单进行聚合计算。 因此对于想要尽量节约内存, 但又需要准确地知道用户是否在线, 又或者需要对用户的在线名单进行聚合计算的应用来说, 使用位图可以说是最佳之选。

    展开全文
  • import redis.clients.jedis.Jedis;public class SetBitTest3 {/*public int uniqueCount(Jedis redis,String action, String date) {String key = action + ":" + date;BitSet users = Bit...

    import java.util.BitSet;

    import redis.clients.jedis.Jedis;

    public class SetBitTest3 {

    /*

    public int uniqueCount(Jedis redis,String action, String date) {

    String key = action + ":" + date;

    BitSet users = BitSet.valueOf(redis.get(key.getBytes()));

    return users.cardinality();

    }

    public int uniqueCount(Jedis redis,String action, String... dates) {

    BitSet all = new BitSet();

    for (String date : dates) {

    String key = action + ":" + date;

    BitSet users = BitSet.valueOf(redis.get(key.getBytes()));

    all.or(users);

    }

    return all.cardinality();

    }*/

    public static byte[] bitSet2ByteArray(BitSet bitSet) {

    byte[] bytes = new byte[bitSet.size() / 8];

    for (int i = 0; i < bitSet.size(); i++) {

    int index = i / 8;

    int offset = 7 - i % 8;

    bytes[index] |= (bitSet.get(i) ? 1 : 0) << offset;

    }

    return bytes;

    }

    public static BitSet byteArray2BitSet(byte[] bytes) {

    BitSet bitSet = new BitSet(bytes.length * 8);

    int index = 0;

    for (int i = 0; i < bytes.length; i++) {

    for (int j = 7; j >= 0; j--) {

    bitSet.set(index++, (bytes[i] & (1 << j)) >> j == 1 ? true: false);

    }

    }

    return bitSet;

    }

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Jedis j = null;

    try {

    j = new Jedis("192.125.155.249", 6379);

    //setbit 参数说明

    //setbit key 用户ID 1 or 0 (1表示用户登入过 0表示没有登入 默认为0)

    // 2016-12-3 login operation user

    //设置2016-12-3登入的用户ID

    j.setbit("login:2016-12-3", 100, true);

    j.setbit("login:2016-12-3", 101, true);

    j.setbit("login:2016-12-3", 102, true);

    j.setbit("login:2016-12-3", 103, true);

    j.setbit("login:2016-12-3", 105, true);

    //一下命令等价redis 命令 bitcount login:2016-12-3

    //BitSet b = BitSet.valueOf(j.get("login:2016-12-3").getBytes());

    BitSet b = byteArray2BitSet(j.get("login:2016-12-3").getBytes());

    // the number of bit value 1

    int lognum3 = b.cardinality();

    System.out.println("2016-12-3 登入用户数量: " + lognum3);

    // 2016-12-3 login operation user

    //设置2016-12-4登入的用户ID

    j.setbit("login:2016-12-4", 100, true);

    j.setbit("login:2016-12-4", 101, true);

    j.setbit("login:2016-12-4", 5852, true);

    //BitSet b2 = BitSet.valueOf(j.get("login:2016-12-4".getBytes()));

    BitSet b2 = byteArray2BitSet(j.get("login:2016-12-4").getBytes());

    int lognum4 = b2.cardinality();

    System.out.println("2016-12-4 登入用户数量: " + b2.cardinality());

    //统计连续两天都登入的用户数

    b.and(b2);

    // or操作之后 同样userid的记录会重合不做记录,所以具体的数据统计看自己的需求而定

    int lognumexceptsameuser = b.cardinality();

    int logtotalnum = lognum3 + lognum4;

    System.out.println("2016-12-3 to 2016-12-4 login user number except same userid: " + lognumexceptsameuser);

    System.out.println("2016-12-3 to 2016-12-4 login user number: " + logtotalnum);

    //输出连续两天都登入的用户

    System.out.println("输出连续两天都登入的用户ID ");

    for (int i = b.nextSetBit(0); i >= 0; i = b.nextSetBit(i + 1)) {

    System.out.print(i + "\t");

    }

    } catch(Exception e) {

    e.printStackTrace();

    }

    finally {

    if (j != null) {

    j.disconnect();

    }

    }

    }

    }

    展开全文
  • 众所周至,拼多多的待遇也是高的可怕,在...废话不多说,今天我们来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis统计一个网站的用户访问数呢...
    众所周至,拼多多的待遇也是高的可怕,在挖人方面也是不遗余力,对于一些工作3年的开发,稍微优秀一点的,都给到30K的Offer,当然,拼多多加班也是出名的,一周上6天班是常态,每天工作时间基本都是超过12个小时,也是相当辛苦的。废话不多说,今天我们来聊一聊拼多多的一道后台面试真题,是一道简单的架构类的题目:拼多多有数亿的用户,那么对于某个网页,怎么使用Redis来统计一个网站的用户访问数呢?

    使用Hash

    哈希是Redis的一种基础数据结构,Redis底层维护的是一个开散列,会把不同的key映射到哈希表上,如果是遇到关键字冲突,那么就会拉出一个链表出来。

    当一个用户访问的时候,如果用户登陆过,那么我们就使用用户的id,如果用户没有登陆过,那么我们也能够前端页面随机生成一个key用来标识用户,当用户访问的时候,我们可以使用HSET命令,key可以选择URI与对应的日期进行拼凑,field可以使用用户的id或者随机标识,value可以简单设置为1。

    当我们要统计某一个网站某一天的访问量的时候,就可以直接使用HLEN来得到最终的结果了。

    04916cb88e2b7a5b6ba04a9db14aa386.png

    优点:简单,容易实现,查询也是非常方便,数据准确性非常高。

    缺点:占用内存过大,。随着key的增多,性能也会下降。小网站还行,拼多多这种数亿PV的网站肯定受不了使用Bitset

    我们知道,对于一个32位的int,如果我们只用来记录id,那么只能够记录一个用户,但如果我们转成2进制,每位用来表示一个用户,那么我们就能够一口气表示32个用户,空间节省了32倍!对于有大量数据的场景,如果我们使用bitset,那么,可以节省非常多的内存。对于没有登陆的用户,我们也可以使用哈希算法,把对应的用户标识哈希成一个数字id。bitset非常的节省内存,假设有1亿个用户,也只需要100000000/8/1024/1024约等于12兆内存。

    6476377e7d3d010db64dbf110ae6b59d.png

    Redis已经为我们提供了SETBIT的方法,使用起来非常的方便,我们可以看看下面的例子,我们在item页面可以不停地使用SETBIT命令,设置用户已经访问了该页面,也可以使用GETBIT的方法查询某个用户是否访问。最后我们通过BITCOUNT可以统计该网页每天的访问数量。

    06a9ad7bb3194de32f02891cab0a25a5.png

    优点占用内存更小,查询方便,可以指定查询某个用户,数据可能略有瑕疵,对于非登陆的用户,可能不同的key映射到同一个id,否则需要维护一个非登陆用户的映射,有额外的开销。

    缺点如果用户非常的稀疏,那么占用的内存可能比方法一更大。使用概率算法

    对于拼多多这种多个页面都可能非常多访问量的网站,如果所需要的数量不用那么准确,可以使用概率算法,事实上,我们对一个网站的UV的统计,1亿跟1亿零30万其实是差不多的。在Redis中,已经封装了HyperLogLog算法,他是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。

    d4027a36985f6bc4e36f8f6eecbab96b.png

    当用户访问网站的时候,我们可以使用PFADD命令,设置对应的命令,最后我们只要通过PFCOUNT就能顺利计算出最终的结果,因为这个只是一个概率算法,所以可能存在0.81%的误差。

    优点占用内存极小,对于一个key,只需要12kb。对于拼多多这种超多用户的特别适用。

    缺点查询指定用户的时候,可能会出错,毕竟存的不是具体的数据。总数也存在一定的误差。

    好了,上面就是常见的3种适用Redis统计网站用户访问数的方法了。今天的介绍我们就讲到这里,如果你有兴趣,欢迎关注我,除了分享算法相关的,最近主要会讲一些redis的原理与应用。近期还准备了一些AI相关的知识,整理后会和大家继续分享。大家的支持是我继续唠嗑的动力。

    来源 | 公众号(沙茶敏碎碎念)

    展开全文
  • $patterns = array('foo:.+','bar:.+','.+'...$redis = new Redis();$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);$result = array_fill_keys($patterns, 0);while ($keys = $redis->scan($it, $ma...
  • 实现方案用户登录的时候往redis里面存储一个值(对应的在线人数增1),这个值的key值是和这个用户的唯一识别码(例如userId或者username)有联系,在存储的同时,设置其对应的生命周期,比如30分钟,当用户在网站上点击...
  • HyperLogLog 是一种概率数据结构,用来估算数据的基数。数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID。...使用 Redis 统计集合的基数一般有三种方法,分别是使用 Redis 的 HashMap,Bit...
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":9,"count":9}]},"card":[{"des":"兼容Redis协议标准的、提供持久化的内存数据库服务,基于高性价比的单节点架构、高...
  • HyperLogLog 是一种概率数据结构,用来估算数据的基数。数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID。基数就是指一个集合中不同值的数目,比如 a, b, c, d 的基数就是 4,a, b...使用 Redis 统计集合的...
  • 统计在线用户的数量,是应用很常见的需求了。如果需要精准的统计到用户是在线,离线状态,我想只有客户端和服务器通过保持一个TCP长连接来实现。如果应用本身并非一个IM应用的话,这种方式成本极高。现在的应用都...
  • 一个业务系统网站每天人数的访问量是多少,在线人数是多少?...1 用表统计方式用数据表统计在线人数,这种方式只能用在并发量不大的情况下。首先我们先新建表:user_loginuser_login表模拟用户登录,不存在...
  • Redis 的特性决定了它本身就不适合做统计方面的操作。因为没有像 SQL 一样的结构化查询语言。这里为你提供一种解决思路,但是需要修改你的数据组织方式:在 redis 中,如果的确有统计的需求,可以使用 SortedSet ...
  • 监控指标性能指标:Performance内存指标: Memory基本活动指标:Basic activity持久性指标: Persistence错误指标:Error监控方式redis-benchmarkredis-statredis-fainaredisliveredis-climonitorshowlogget:获取慢...
  • 使用 Redis 统计集合的基数一般有三种方法,分别是使用 Redis 的 HashMap,BitMap 和 HyperLogLog。前两个数据结构在集合的数量级增长时,所消耗的内存会大大增加,但是 HyperLogLog 则不会。 Redis 的 HyperLogLog...
  • 主从复制相关信息 CPU:CPU使用情况 cluster:集群信息 Keypass:键值对统计数量信息 终端info命令使用 ./redis-cli info 按块获取信息 | grep 需要过滤的参数 ./redis-cli info stats | grep ops 交互式...
  • 6、Replication:主从复制相关信息 7、CPU:CPU使用情况 8、cluster:集群信息 9、Keypass:键值对统计数量信息 终端info命令使用 ./redis-cli info 按块获取信息 | grep 需要过滤的参数 ./redis-cli info stats | ...
  • 主从复制相关信息 CPU:CPU使用情况 cluster:集群信息 Keypass:键值对统计数量信息 终端info命令使用 ./redis-cli info 按块获取信息 | grep 需要过滤的参数 ./redis-cli info stats | grep ops 交互式...
  • 6.Replication:主从复制相关信息 7.CPU:CPU使用情况 8.cluster:集群信息 9.Keypass:键值对统计数量信息 基本活动指标: redis连接了多少客户端 通过观察其数量可以确认是否存在意料之外的连接。如果发现数量不...
  • SpringSession系列之通过Redis统计在线用户数量,最近遇到一个比较紧急的任务,要求统计在线用户,目的是配合性能测评,要求证明自己系统的在线用户能够达标,不过系统因为历史原因,并没有这个功能,所以只能去...
  • 最近有个需求是需要统计某个版本的安装数量,之前接触过类似的需求,使用 redis 的bitmap 来记录,比如user_id是11位的,比如我们统计一下:setbit today 4294967295 1setbit today 1 1redis-cli --bigkeys统计显示:...
  • 统计网站游客数量跟登录数量还有抽奖数量 提示:以下是本篇文章正文内容,下面案例可供参考 一、项目场景介绍 游客数量:访问主页的游客数量 需要过滤重复数据 登录数量:系统登录的客户数 需要过滤重复数据 抽奖数量...
  • 前言在工作中我们经常遇到这样的需求,要对某个在线网站的活跃用户数量进行统计。这里我们以redis为例,说明一下其实现的过程。实现方法在Redis中存在bitmap这种数据类型,这种数据类型是建立在string数据类型之上的。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 459
精华内容 183
关键字:

redis统计数量

redis 订阅