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
"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、列表、集合

原文地址:https://www.cnblogs.com/shiqi17/p/9570718.html

时间: 2024-10-05 23:12:18

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

Redis笔记系列(二)——Redis安装部署与维护详解

本文介绍Redis2.8的安装部署和维护方法. Redis在linux上的安装 步骤1: 首先从官网下在redis正式版的压缩包redis-2.8.19.tar.gz http://download.redis.io/releases/redis-2.8.19.tar.gz 步骤2:编译源程序: tar zxvf redis-2.8.19.tar.gz [[email protected] Downloads]$ tar zxvf redis-2.8.19.tar.gz [[email prot

分布式缓存技术redis学习系列----深入理解Spring Redis的使用

关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么优秀的一个框架.Spring-data-redis为spring-data模块中对redis的支持部分,简称为"SDR",提供了基于jedis客户端API的高度封装以及与spring容器的整合,事实上jedis客户端已经足够简单和轻量级,而spring-data-redis反而具有&quo

探究redis和memcached的 LRU算法--------redis的LRU的实现

一直对这redis和memcached的两个开源缓存系统的LRU算法感兴趣.今天就打算总结一下这两个LRU算法的实现和区别. 首先要知道什么是LRU算法:LRU是Least Recently Used 近期最少使用算法.相关的资料网上一大堆.http://en.wikipedia.org/wiki/Cache_algorithms#LRU   redis的六种策略 rewriteConfigEnumOption(state,"maxmemory-policy",server.maxme

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

关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么优秀的一个框架.这里,我们就对比之前对spring orm中对hibernate的使用,来理解使用spring redis的使用.(本文章不做redis基本命令使用的讲解) 1. Redis使用场景 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Va

redis浅谈教你使用redis(一)

随着数据体积的激增,MySQL+memcache已经满足不了大型互联网类应用的需求,许多机构也纷纷选择Redis作为其架构上的补充,然而Redis的使用门槛并不低,比如不支持SQL等,这里为大家分享Redis的使用全攻略. Redis,备受关注的NoSQL数据库之一,已为众多知名互联网公司使用,比如新浪微博.Pinterest及Viacom.然而,天生不支持SQL却让他看起来很不容易接近,这里我们一起看@utopiar的博文--探索Redis. 探索之一:Redis? What is it? 简

redis使用基础(六) ——Redis集群

redis使用基础(六) --Redis集群 (转载请附上本文链接--linhxx) 一.单台服务器 单台redis服务器,会出现单点故障,且需要承受所有的负载.另外,所有的内容都存在单个服务器上,该服务器会成为瓶颈. 使用多台服务器作为redis服务器,需要考虑集群管理,如数据一致性.增加节点.故障恢复等问题.redis对处理这些问题有一套方案. 二.复制 redis的持久化功能保证了数据的持久性,但是如果服务器故障,数据还是可能会丢失,因此需要将数据备份到其他服务器.当一台服务器内容更新,会

redis使用基础(一) ——Redis基本概述与安装配置

redis使用基础(一) --Redis基本概述与安装配置 (转载请附上本文链接--linhxx) 一.特性 1.存储方式 Redis采用Key-Value类型进行存储,数据存储在内存中,不存在硬盘中,由于避开了I/O,因此读写速度比关系型数据库快很多,普通的笔记本每秒可以读写超过10万个键值. 2.持久性 为了避免存在内存中导致的程序退出后数据丢失问题,Redis提供将数据异步写入硬盘,不影响继续提供服务. 3.灵活性 Redis可以为每个键设置生存时间,到期后自动删除.就此而言可以将其用作缓

虚拟机centOS中安装Redis,主机Redis Destop Manager不能访问虚拟机Redis server的解决方案

今天在学些redis的时候碰到个问题,发现主机Redis Destop Manager不能访问虚拟机Redis server的解决方案,找了一些网上的资料,原因可能有两个,整理记录下来: 1. Redis.conf文件中打开了 # By default Redis listens for connections from all the network interfaces# available on the server. It is possible to listen to just on

分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)

上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 回到顶部 安全性设置 设置客户端操作秘密 redis安装好后,默认情况下登陆客户端和使用命令操作时不需要密码的.某些情况下,为了安全起见,我们可以设置在客户端连接后进行任何操作之前都要进行密码验证.修改redis.conf进行配置. [[email protected] ~]# vi /usr/local/redis/etc/redis.conf ###