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)
- 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
- 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"
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 在后面追加
- 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
"cnny\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
......................................................
0\x00\x00\x00\x00\x00\x00\x04"
- 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 的使用,及如何使用redis维护数亿人的登录状态的更多相关文章
- redis之(二十一)redis之深入理解Spring Redis的使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...
- 深入理解Spring Redis的使用 (一)、Spring Redis基本使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...
- Redis进阶实践之十九 Redis如何使用lua脚本
一.引言 redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...
- Redis详解(二)------ redis的配置文件介绍
上一篇博客我们介绍了如何安装Redis,在Redis的解压目录下有个很重要的配置文件 redis.conf (/opt/redis-4.0.9目录下),关于Redis的很多功能的配置都在此文件中完成的 ...
- Redis详解(三)------ redis的五大数据类型详细用法
我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据 ...
- 【Redis】windows环境下安装redis服务器,并配置php的redis扩展
win7示例: 1.下载Redis服务器 : https://github.com/dmajkic/redis/downloads:(随便下,建议不要太老的) 2.在D:\phpStudy\ 新建Re ...
- redis之(十六)redis的cluster集群环境的搭建,转载
最近redis已经比较火了,有关redis的详细介绍,网上有一大堆,我这里只作简单的介绍,然后跟大家一起学习Redis Cluster 3.0的搭建与使用.Redis是一款开源的.网络化的.基于内存的 ...
- Redis学习笔记(5)—— Redis的持久化方案&Redis的集群搭建
一.Redis的持久化方案 Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种 ...
- Redis学习总结(1)——Redis内存数据库详细教程
1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数 ...
随机推荐
- MySQL多表更新的一个坑
简述 MySQL支持update t1,t2 set t1.a=2;这种语法,别的关系数据库例如oracle和sql server都不支持.这种语法有时候写起来挺方便,但他有一个坑. 测试脚本 dro ...
- SqlServer误删数据恢复
误删数据,操作步骤: 第一步: 找到误删的数据库之前备份文件. 第二步: 1,修改数据库备份模式为:大容量日志 2,修改访问限制为:SINGLE_USER(单用户模式) 第三步: 执行sql一条一条执 ...
- c/c++ 多态的实现原理分析
多态的实现原理分析 当类里有一个函数被声明成虚函数后,创建这个类的对象的时候,就会自动加入一个__vfptr的指针, __vfptr维护虚函数列表.如果有三个虚函数,则__vfptr指向的是第一个虚函 ...
- [Hive_6] Hive 的内置函数应用
0. 说明 Hive 的内置函数的基本操作 | 时间函数 | String 函数 | 条件语句 | explode | split | substring 1. 基本操作 查看函数 show func ...
- Yahoo团队网站性能优化的35条黄金守则
转载 Excetional Performance 团队总结出了一系列可以提高网站速度的方法.可以分为 7大类 35条.包括内容 .服务器 . CSS . JavaScript .Cookie .图片 ...
- Ribbon - WeightedResponseTimeRule原理
根据响应时间计算权重,响应越长,权重越低,权重越低的服务器,被选择的可能性就越低 //定时统计权重serverWeightTimer.schedule(new DynamicServerWeightT ...
- PHP与Nginx之间的运行机制以及原理
一.普及Nginx与Php-fpm相关知识点 Nginx是什么 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服 ...
- 【vue】vue +element 搭建项目,组件之间通信
父子组件通信 父 通过props属性给 子传递数据 子 操作 父 this.$parent.XXX 子通过$emit传递参数 或者通过vue-bus vue-bus既可以实现父子组件之间的通信,也可 ...
- 04 python 初学(数据类型)
数据类型: 数字: 整数 int (integer) python3 已经不区分整型和长整型了,都叫整型 浮点型 float 复数 complex 布尔: True False 字符串 ...
- ActiveMQ的两种消息模式,主题、队列
1.开发的模式流程如下: 2.队列模式Queue 如果生产者产生了100条消息,那么两个消费同时在的话,会分工合作来接收这100条消息.就是每个消费者接收到50条来处理. 3.主题模式topic 如果 ...