一、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. Ubuntu 16.04安装JDK(转载)

    1.简单的安装方法 安装JDK的最简单方法应该就是使用apt-get来安装了,但是源一般是OpenJDK,如果需要安装Oracle的JDK这种方法就不合适了,直接跳过看下面的章节. 1.使用ctrl+ ...

  2. LeetCode算法题-Majority Element(Java实现)

    这是悦乐书的第181次更新,第183篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第40题(顺位题号是169).给定大小为n的数组,找到数组中出现次数超过n/2的元素.假 ...

  3. JavaScript的内置对象(Global对象)

    内置对象的定义 由 javaScript 实现提供的.不用自己创建,这些对象在 ECMAScript 程序执行之前就已经存在了. 意思就是说,开发人员不必显示地实例化内置对象:因为它们已经实例化了. ...

  4. 5.04-requests_cookies

    import requests # 请求数据url member_url = 'https://www.yaozh.com/member/' headers = { 'User-Agent': 'Mo ...

  5. CUDA Fortran for Scientists and Engineers第二版翻译

          下午听朋友说,NV把<CUDA Fortran for Scientists and Engineers>的出版权卖给了国内某出版商.第一反应是我们三翻译的岂不是白翻译了.第二 ...

  6. JS学习实践(1) JavaScript 修改图像灯泡

    修改灯泡 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  7. hyperledge环境安装

    1.安装环境 1)本机安装 前提是已经安装好了docker\docker-compose\go,相应的内容可见 docker-1-环境安装及例子实践 docker官方文档学习-1-Docker for ...

  8. Redis学习之SDS源码分析

    一.SDS的简单介绍 SDS:简单动态字符串(simple dynamic string) 1)SDS是Redis默认的字符表示,比如包含字符串值的键值对都是在底层由SDS实现的 2)SDS用来保存数 ...

  9. centos 7 安装 MySQL 5.6

    由于Centos7 默认数据库是mariabd,所以通过rpm安装MySQL需要卸载原有的Mariabd,再下载所有的依赖包比较麻烦且容易出错.通过yum的方式安装.yum其实是rpm的一个升级将所有 ...

  10. Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务

    首先简单解释一下什么是声明式实现? 要做一件事, 需要知道三个要素,where, what, how.即在哪里( where)用什么办法(how)做什么(what).什么时候做(when)我们纳入ho ...