Redis

Redis安装(docker版)

查看可用版本

1
docker search redis

拉取最新镜像

1
docker pull redis:latest

查看镜像

1
docker images

运行容器

1
docker run -itd --name redis -p 6379:6379 redis
  • -p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。

安装成功

查看容器运行信息

1
docker ps

进入容器

1
docker exec -it redis /bin/bash

通过 redis-cli 连接测试使用 redis 服务及查看版本信息

1
2
redis-cli
info

常用5大数据类型

Redis键相关操作:

  • keys *:查看当前库所有key,匹配key *1
  • exists <key> [<key> …]:查看key是否存在,存在返回匹配的键个数,不存在返回0
  • type <key>:查看key值的类型
  • del <key>:删除指定的key数据
  • unlink <key>:根据value选择非阻塞删除,仅将keys从keyspace元数据删除
  • expire <key> second:给指定的key设置过期时间
  • ttl <key>:查看还有多少秒过期,-1永不过期,-2已过期
  • select index:切换数据库默认16个库,0~15
  • dbsize:查看当前数据库key的数量
  • flushdb:清空当前数据库
  • flushall:清空所有数据库

String

  • set <key> <value> [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]:增加键值对,如果该key存在,则会覆盖value

    NX:当数据库中不存在该key时,可以将key-value设置到数据库

    XX:当数据库存在该key时,可以将key-value设置到数据库,与NX互斥

    EX:key超时的秒数,与PX互斥,使用PX会覆盖该超时时间,-1:永不过期,-2:已过期

    PX:key超时的毫秒数,与EX互斥,使用EX会覆盖该超时时间,-1:永不过期,-2:已过期

  • get <key>:获取key对应值

  • append <key> <value>:将value追加到key原本键值后,返回追加后value长度

  • strlen <key>:获取value的长度

  • setnx <key> <value>:只有当key不存在时,设置key-value,原子性操作,可用于实现分布式锁

  • incr <key>:将key中储存的数字值增1,只能对数字值操作,如果为空,新增值为1

  • decr <key>:将key中储存的值减1,只能对数字值操作,如果为空,新增值为-1

  • incrby <key> <increment>:将key中的数字增加指定步长

  • keys *:查看所有该数据库所有key

  • mset <key> <value> [<key> <value>]:同时设置多个key-value对

  • mget <key> [<key>]:同时获取多个value

  • msetnx <key> <value> [<key> <value>]:同时设置多个key-value对,当且仅当所有key不存在时才设置,原子性,有一个失败则都失败

  • getrange <key> start end:获取范围的值,类似subString,前包后包

  • setrange <key> <offset> <value>:用value覆写所储存的字符串值,从offset开始(索引从0开始)

  • setex <key> <second> <value>:设置键值的同时设置过期时间,单位秒

  • getset <key> <value>:设置新值的同时返回旧值

List

  • lpush/rpush <key> <value> [<value>…]:从左边、右边插入一个或多个值
  • lpop/rpop <key>:从左边、右边弹出一个值,值在键在,值光键亡
  • rpoplpush <key> <key2>:从key1列表右边吐出一个值,插入到key2列表左边
  • lrange <key> start stop:按照索引下标获取元素(从左往右),0 -1表示从头到尾
  • lindex <key> <index>:按照索引下标获取元素(从左到右)
  • llen <key>:获取列表长度
  • linster <key> before|after <value> <newValue>:在value的后面|前面插入newValue
  • lrem <key> <n> <value>:从左边删除n个value(从左到右)
  • lset <key> <index> <value>:将列表key下标为index的值替换成value

Set

  • sadd <key> <value> [<value>]:将一个或者多个元素加入到集合key中,已存在的元素将被忽略
  • smembers <key>:取出该集合的所有元素
  • sismember <key> <value>:判断集合key是否含有该value值,有返回1,没有返回0
  • scard <key>:返回该集合的元素个数
  • srem <key> <value> [<value>]:删除集合中的,某个元素
  • spop <key> [count]:随机从该集合中吐出一个值,从集合中删除
  • srandmember <key> [count]:随机从该集合中取出n个值。不会从集合中删除。
  • smove <source> <destination> <value>:把集合中的一个值从一个集合移动到另外一个集合中
  • sinter <key1> <key2> [<key3>…]:返回多个集合的交集元素
  • sunion <key1> <key2> [<key3>…]:返回多个集合元素的并集元素
  • sdiff <key1> <key2> [<key3>…]:返回多个集合的差集元素

Hash

  • hset <key> <field> <value> [filed value]:给key集合中的field属性设置值value

  • hget <key> <field>:从集合key中获取属性属性field的值

  • hmset <key> <field> <value> [filed value]:批量设置hash的值

  • hexists <key> <field>:查看哈希表key中的field属性是否存在,存在返回1,不存在返回0

  • hkeys <key>:列出该hash集合key的所有属性field

  • hvals <key>:列出该hash集合key的所有值value

  • hincrby <key> <field> <increment>:为hash表key中的属性field的值value加上增量increment,整数增加,负数减少

  • hsetnx <key> <field> <value>:将hash表key中的属性field设置值value,当且仅当该属性field不存在

Zset

  • zadd <key> <score> <value> [score value …]:将一个或多个member元素及其score值加入到有序集合key中
  • zrange <key> <start> <stop> [withscores]:返回有序集合key中,下标从start到stop之间的元素,带withscores,可以让分数和值一起返回到结果集,从小到大
  • zrevrange <key> <start> <stop> [withscores]:返回有序集合key中,下标从start到stop之间的元素,带withscores,可以让分数和值一起返回到结果集,从大到小
  • zrangebyscore <key> <min> <max> [withscores] [limit offset count]:返回有序集合key中,所有score值介于[min max]之间的成员, 有序成员按score值递增(从小到大)依次排序
  • zrevrangebyscore <key> <max> <min> [withscores] [limit offset count]:同上,从大到小排序
  • zincrby <key> <increment> <value>:为元素的score加上增量
  • zrem <key> <value>:删除该集合下指定的元素
  • zcount <key> <min> <max>:统计该集合,分数区间内的元素个数
  • zrank <key> <value>:返回该值在集合中的排名,从0开始

数据结构

hash + 跳跃表

配置

bind 127.0.0.1:允许访问redis的ip地址

protected-mode yes:本机访问保护模式

需要支持远程连接要把bind 配置注释,protected-mode改为no

Redis的发布和订阅

发布

  • publish <channel> <message>

    向不存在的频道发送消息会返回0,

订阅

  • subscribe <channel> [<channel>…]

    可以订阅多个频道,频道在订阅的时候创建

Redis6 新数据类型

BitMaps

简介

  1. Bitmaps并不是一种数据类型,实际上就是字符串,但是它可以对字符串的位进行操作
  2. Bitmaps提供了一套单独的命令,所以在使用Bitmaps和使用字符串的方法不太相同,可以把BitMaps想象成一个以位为单位的数组,数组的每个单元只能储存0和1,数组的下标在Bitmaps中叫做偏移量
  3. 用途:,可以用来做签到统计,或者活跃用户统计,用户量越大,越节省空间,用户量不大可以选择set之类的

命令

  • setbit <key> <offset> <value>:设置Bitmaps中偏移量offset的 值,只能为0/1

  • getbit <key> <offset>:获取key的第offset位的值

  • bitcount <key> [<start> <end>]:统计值为1的字节个数

    没有设置开始和结束时,统计从开始到结尾为1的数量

    start为正数,end为正数时表示,统计从start到end位置值为1的个数

    start为正数,end为负数时表示,统计从start到倒数end的位置值为1的个数

  • bitop <operation> <destkey> <key> [<key>…]:对多个Bitmaps集合进行操作并将结果保存到destkey中

    operation:and(交集),or(并集),not(非),xor(异或)

Bitmaps与set对比

假设网站有1亿用户, 每天独立访问的用户有5千万, 如果每天用集合类型和Bitmaps分别存储活跃用户可以得到表

set和Bitmaps存储一天活跃用户对比
数据类型 每个用户id占用空间 需要存储的用户量 全部内存量
集合类型 64位 50000000 64位*50000000 = 400MB
Bitmaps 1位 100000000 1位*100000000 = 12.5MB

很明显, 这种情况下使用Bitmaps能节省很多的内存空间, 尤其是随着时间推移节省的内存还是非常可观的

set和Bitmaps存储独立用户空间对比
数据类型 一天 一个月 一年
集合类型 400MB 12GB 144GB
Bitmaps 12.5MB 375MB 4.5GB

但Bitmaps并不是万金油, 假如该网站每天的独立访问用户很少, 例如只有10万(大量的僵尸用户) , 那么两者的对比如下表所示, 很显然, 这时候使用Bitmaps就不太合适了, 因为基本上大部分位都是0。

set和Bitmaps存储一天活跃用户对比(独立用户比较少) - - -
数据类型 每个userid占用空间 需要存储的用户量 全部内存量
集合类型 64位 100000 64位*100000 = 800KB
Bitmaps 1位 100000000 1位*100000000 = 12.5MB

HyperLogLog