一、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
"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 中的hash、列表、集合

请点这儿,redis中的hash、列表、集合

redis 的使用,及如何使用redis维护数亿人的登录状态的更多相关文章

  1. redis之(二十一)redis之深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  2. 深入理解Spring Redis的使用 (一)、Spring Redis基本使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  3. Redis进阶实践之十九 Redis如何使用lua脚本

    一.引言               redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...

  4. Redis详解(二)------ redis的配置文件介绍

    上一篇博客我们介绍了如何安装Redis,在Redis的解压目录下有个很重要的配置文件 redis.conf (/opt/redis-4.0.9目录下),关于Redis的很多功能的配置都在此文件中完成的 ...

  5. Redis详解(三)------ redis的五大数据类型详细用法

    我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据 ...

  6. 【Redis】windows环境下安装redis服务器,并配置php的redis扩展

    win7示例: 1.下载Redis服务器 : https://github.com/dmajkic/redis/downloads:(随便下,建议不要太老的) 2.在D:\phpStudy\ 新建Re ...

  7. redis之(十六)redis的cluster集群环境的搭建,转载

    最近redis已经比较火了,有关redis的详细介绍,网上有一大堆,我这里只作简单的介绍,然后跟大家一起学习Redis Cluster 3.0的搭建与使用.Redis是一款开源的.网络化的.基于内存的 ...

  8. Redis学习笔记(5)—— Redis的持久化方案&Redis的集群搭建

    一.Redis的持久化方案 Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种 ...

  9. Redis学习总结(1)——Redis内存数据库详细教程

    1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数 ...

随机推荐

  1. MySQL多表更新的一个坑

    简述 MySQL支持update t1,t2 set t1.a=2;这种语法,别的关系数据库例如oracle和sql server都不支持.这种语法有时候写起来挺方便,但他有一个坑. 测试脚本 dro ...

  2. SqlServer误删数据恢复

    误删数据,操作步骤: 第一步: 找到误删的数据库之前备份文件. 第二步: 1,修改数据库备份模式为:大容量日志 2,修改访问限制为:SINGLE_USER(单用户模式) 第三步: 执行sql一条一条执 ...

  3. c/c++ 多态的实现原理分析

    多态的实现原理分析 当类里有一个函数被声明成虚函数后,创建这个类的对象的时候,就会自动加入一个__vfptr的指针, __vfptr维护虚函数列表.如果有三个虚函数,则__vfptr指向的是第一个虚函 ...

  4. [Hive_6] Hive 的内置函数应用

    0. 说明 Hive 的内置函数的基本操作 | 时间函数 | String 函数 | 条件语句 | explode | split | substring 1. 基本操作 查看函数 show func ...

  5. Yahoo团队网站性能优化的35条黄金守则

    转载 Excetional Performance 团队总结出了一系列可以提高网站速度的方法.可以分为 7大类 35条.包括内容 .服务器 . CSS . JavaScript .Cookie .图片 ...

  6. Ribbon - WeightedResponseTimeRule原理

    根据响应时间计算权重,响应越长,权重越低,权重越低的服务器,被选择的可能性就越低 //定时统计权重serverWeightTimer.schedule(new DynamicServerWeightT ...

  7. PHP与Nginx之间的运行机制以及原理

    一.普及Nginx与Php-fpm相关知识点 Nginx是什么 Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服 ...

  8. 【vue】vue +element 搭建项目,组件之间通信

    父子组件通信 父 通过props属性给 子传递数据 子 操作 父  this.$parent.XXX 子通过$emit传递参数 或者通过vue-bus vue-bus既可以实现父子组件之间的通信,也可 ...

  9. 04 python 初学(数据类型)

    数据类型: 数字: 整数  int (integer) python3 已经不区分整型和长整型了,都叫整型 浮点型 float 复数 complex 布尔: True        False 字符串 ...

  10. ActiveMQ的两种消息模式,主题、队列

    1.开发的模式流程如下: 2.队列模式Queue 如果生产者产生了100条消息,那么两个消费同时在的话,会分工合作来接收这100条消息.就是每个消费者接收到50条来处理. 3.主题模式topic 如果 ...