redis-基础-HyperLogLog&发布订阅&事务&脚本&连接&服务器&数据备份与恢复&安全

一. HyperLogLog

基数统计的算法,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的;
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。
基数
数据中不重复的个数,基数估计就是在误差可接受的范围内,快速计算基数。
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5.

redis 127.0.0.1:6379> PFADD runoobkey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
(integer) 3
# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
# 返回给定 HyperLogLog 的基数估算值
PFCOUNT key [key ...]
# 将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]

二. Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消
Redis 客户端可以订阅任意数量的频道
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端

例子:创建redisChat频道

redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息

redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1

# 订阅者的客户端会显示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"

Redis 发布订阅命令

# 订阅一个或多个符合给定模式的频道
PSUBSCRIBE channel [channel ...]
# 查看订阅与发布系统状态
PUBSUB subcommand [argument [argument ...]]
# 将信息发送到指定的频道
PUBLISH channel message
# 退订所有给定模式的频道
PUNSUBSCRIBE [pattern [pattern ...]]
# 订阅给定的一个或多个频道的信息
SUBSCRIBE channel [channel ...]
# 指退订给定的频道
UNSUBSCRIBE [channel [channel ...]]

三. 事务

多条指令有序的原子操作,执行会经过三个阶段

  1. 开始事务
  2. 命令入队
  3. 执行事务
    以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

事务命令

# 取消事务,放弃执行事务块内的所有命令
DISCARD
# 执行所有事务块内的命令
EXEC
# 标记一个事务块的开始
MULTI
# 取消 WATCH 命令对所有 key 的监视
UNWATCH
# 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
WATCH key [key ...]

四. Redis 脚本

Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL
Eval命令基本语法
EVAL script numkeys key [key ...] arg [arg ...]

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

脚本命令

# 执行 Lua 脚本
EVAL script numkeys key [key ...] arg [arg ...]
# 根据给定的 sha1 校验码,执行缓存在服务器中的脚本
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
# 查看指定的脚本是否已经被保存在缓存当中
SCRIPT EXISTS script [script ...]
# 从脚本缓存中移除所有脚本
SCRIPT FLUSH
# 杀死当前正在运行的 Lua 脚本
SCRIPT KILL
# 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本
SCRIPT LOAD script

脚本的具体内容需要看lua脚本的内容
http://www.runoob.com/lua/lua-tutorial.html

五. Redis 连接

# 验证密码是否正确
AUTH password
# 打印字符串
ECHO message
# 查看服务是否运行
PING
# 关闭当前连接
QUIT
# 切换到指定的数据库
SELECT index

设置密码

redis 127.0.0.1:6379> AUTH PASSWORD
(error) ERR Client sent AUTH, but no password is set
redis 127.0.0.1:6379> CONFIG SET requirepass "mypass"
OK
redis 127.0.0.1:6379> AUTH mypass
Ok

五. Redis 服务器

Redis 服务器命令主要是用于管理 redis 服务
INFO查看服务器信息

# 异步执行一个 AOF(AppendOnly File) 文件重写操作,2.4之后重写回自动触发
BGREWRITEAOF
# 在后台异步保存当前数据库的数据到磁盘
BGSAVE
# 关闭客户端连接
CLIENT KILL [ip:port] [ID client-id]
# 获取连接到服务器的客户端连接列表
CLIENT LIST
# 获取连接的名称
CLIENT GETNAME
# 在指定时间内终止运行来自客户端的命令
CLIENT PAUSE timeout
# 设置当前连接的名称
CLIENT SETNAME connection-name
# 获取集群节点的映射数组
CLUSTER SLOTS
# 获取 Redis 命令详情数组
COMMAND
# 获取 Redis 命令总数
COMMAND COUNT
# 获取给定命令的所有键
COMMAND GETKEYS
# 返回当前服务器时间
TIME
# 获取指定 Redis 命令描述的数组
COMMAND INFO command-name [command-name ...]
# 获取指定配置参数的值
CONFIG GET parameter
# 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
CONFIG REWRITE
# 修改 redis 配置参数,无需重启
CONFIG SET parameter value
# 重置 INFO 命令中的某些统计数据
CONFIG RESETSTAT
# 返回当前数据库的 key 的数量
DBSIZE
# 获取 key 的调试信息
DEBUG OBJECT key
# 让 Redis 服务崩溃
DEBUG SEGFAULT
# 删除所有数据库的所有key
FLUSHALL
# 删除当前数据库的所有key
FLUSHDB
# 获取 Redis 服务器的各种信息和统计数值
INFO [section]
# 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
LASTSAVE
# 实时打印出 Redis 服务器接收到的命令,调试用
MONITOR
# 返回主从实例所属的角色
ROLE
# 异步保存数据到硬盘
SAVE
# 异步保存数据到硬盘,并关闭服务器
SHUTDOWN [NOSAVE] [SAVE]
# 将当前服务器转变为指定服务器的从属服务器(slave server)
SLAVEOF host port
# 管理 redis 的慢日志
SLOWLOG subcommand [argument]
# 用于复制功能(replication)的内部命令
SYNC

六. 数据备份与恢复

Redis SAVE 命令用于创建当前数据库的备份,该命令将在 redis 安装目录中创建dump.rdb文件
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:

redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"

创建 redis 备份也可以使用BGSAVE,在后台执行

127.0.0.1:6379> BGSAVE
Background saving started

七. 安全

redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证
查询是否设置了密码,默认为空,不需要密码

127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

可以通过下面的命令设置密码

127.0.0.1:6379> CONFIG set requirepass "runoob"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "runoob"

密码登录AUTH password

127.0.0.1:6379> AUTH "runoob"
OK
127.0.0.1:6379> SET mykey "Test value"
OK
127.0.0.1:6379> GET mykey
"Test value"
posted @ 2016-10-08 20:18  zhangshihai1232  阅读(129)  评论(0)    收藏  举报