• redis 的使用,及如何使用redis维护数亿人的登录状态


    一、redis中几个常用的方法
    redis的使用场景移步本文 - select db redis 下默认有有16个表,0~15可以通过:select 2 或者 select 11这样的方式切换表
    • keys pattern 查看该表下匹配到的 keys 命令 keys * 查看表下所有key

    • type key 查看key对应的类型

    • exists key 检测key是否是表中存在

    • expire key time 为某个key设置超时时间

    • move key db 将key 移动到另一个db下

    • del key 删除指定key 还可以一次性删除多个: del key1 key2 key3

    127.0.0.1:6379> keys *
    1) "loveyue"
    2) "name"
    3) "num"
    127.0.0.1:6379> type name
    string
    127.0.0.1:6379> exists info
    (integer) 0
    127.0.0.1:6379> expire name 1
    (integer) 1
    127.0.0.1:6379> get name
    (nil)
    127.0.0.1:6379> keys *
    1) "loveyue"
    2) "num"
    
    127.0.0.1:6379> set name2 'lina'
    OK
    127.0.0.1:6379> set name3 'david'
    OK
    127.0.0.1:6379> keys name*
    1) "name2"
    2) "name3"
    127.0.0.1:6379> del name2 name3
    (integer) 2
    127.0.0.1:6379> keys name*
    (empty list or set)
    
    
    二、string操作
    • set key value 设置key对应value 后面还有可选参数, ex:超时时间(秒) px: 毫秒 nx: 只有当key 不存在时,才会创建, xx: 只有当key存在时才能修改
      127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX] 如:set name lina ex 3 nx
    127.0.0.1:6379> keys *
    1) "loveyue"
    2) "num"
    127.0.0.1:6379> set name lina ex 10 nx
    OK
    127.0.0.1:6379> get name
    "lina"
    
    • setnx key value 只有不存在是才创建,和上面的带可选参数nx 一样

    • setxx key value 同理

    • setex key seconds value 直接设置超时时间 setex name 5 lina 这个5秒后就不在了

    • get key 获取key 对应的value 如:get name

    2.2 批量设置和获取
    • mset key1 value1 key2 value2 可以一次性设置多个key-value
    • mget key1 key2 一次性获得多个value
    127.0.0.1:6379> mset name1 lina name2 david name3 wang
    OK
    127.0.0.1:6379> mget name1 name2 name3
    1) "lina"
    2) "david"
    3) "wang"
    
    2.3 一些其他方法
    • strlen key 返回字符串长度,注意utf-8下一个中文三个字节

    • getset key value 获取到key原来的值返回,并给它赋新值value

    • getrange key start end 获取key 对应的字符,并切片 从 start 到 end 返回

    • setrange key offset value 将key对应 值,从offset 位置开始用value覆盖

    127.0.0.1:6379> getset name1 xxxx
    "lina"
    127.0.0.1:6379> getrange name1 1 -1
    "xxx"
    127.0.0.1:6379> setrange name1 1 99999
    (integer) 6
    127.0.0.1:6379> get name1
    "x99999"
    
    • incr key 自增,调用一次自增一

    • decr key 自减

    • append key value 在后面追加

    2.4 setbit 的牛逼应用 维护数亿人的登录状态
    • setbit key offset value 这个命令会把key下面的值的二进制数据格式,长度的offset位置的值改为value(只能为 0 或 1)
      如 name -anny 如果执行命令: setbit name 6 1 那么anny--->cnny ,原理 a 的ASCII 值为:97 在内存中二进制数据为:0b1100001 改动第六位变成: 0b1100011 ASCII值变为99变成了c
    127.0.0.1:6379> set name anny
    OK
    127.0.0.1:6379> setbit name 6 1
    (integer) 0
    127.0.0.1:6379> get name
    "cnny"
    

    当然你还可以不用管key 对应的值是什么随便设置

    • setbit name 1997 1 如我将1997位设置为1 ,当然字符串的长度4x8=32 位肯定不够1千多位,中间缺少的自动用0补齐了
    127.0.0.1:6379> setbit name 1997 1
    (integer) 0
    127.0.0.1:6379> get name
    "cnnyx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x
    ......................................................
    0x00x00x00x00x00x00x04"
    
    • bitcount key start end 统计该值中二进制数据一共有多少个1,后面两个为可选参数,默认0到最后(-1)
    • gitbit key offset 拿到key 对应的offset 位置的二进制数据是为0 还是1
    127.0.0.1:6379> bitcount name 0 -1
    (integer) 20
    127.0.0.1:6379> bitcount name
    (integer) 20
    127.0.0.1:6379> getbit name 6
    (integer) 1
    

    应用场景:假设你要维护数亿条登录状态数据,如腾讯QQ,微信什么的,如果是在mysql中,我们就需要增加一个字段login_status,存登录状态,但是数以亿计的就会导致耗费巨量存储空间,及查询速度
    但是我们使用redis 的这个功能, setbit gitbit bitcount
    我们只需要0表示未登录,1表示登录

    那么一亿人的数据会占据多大空间呢?8x1024x1024x12 = 100663296 一亿多十万。 也就12M的空间
    当第1717个人登录时:我们只需
    setbit login_status 1717 1
    当他注销时:
    setbit login_status 1717 0

    查看第437 个人是否是登录状态
    getbit login_status 437

    统计当前有多少人在线
    bitcount login_status 0 -1

    127.0.0.1:6379> setbit login_status 1717 1
    (integer) 0
    127.0.0.1:6379> setbit login_status 437 1
    (integer) 0
    127.0.0.1:6379> getbit login_status 437
    (integer) 1
    127.0.0.1:6379> bitcount login_status
    (integer) 4
    
    redis 中的hash、列表、集合
    请点这儿,redis中的hash、列表、集合
  • 相关阅读:
    用户模板和用户场景
    人月神话阅读笔记02
    人月神话阅读笔记01
    软件工程周总结07
    NABCD
    软件工程周总结06
    软件工程周总结05
    tomcat端口被占用
    SQLyog出现2003错
    一维最大子数组和(续)
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9570718.html
Copyright © 2020-2023  润新知