redis学习笔记-1

Redis简介

特点

  • Redis支持数据的持久化,可以将内存中的数据以快照和日志的形式保存在磁盘中,重启的时候可以再次加载进行使用。

  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  • Redis支持数据的备份,即master-slave模式的数据备份。

优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

区别

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

相关资源

Redis 官网:https://redis.io/
源码地址:https://github.com/redis/redis
Redis 在线测试:http://try.redis.io/
Redis 命令参考:http://doc.redisfans.com/
docker run -d -p 6379:6379 redis

redis安装

下载地址:http://redis.io/download
# wget http://download.redis.io/releases/redis-6.2.6.tar.gz
# tar xzf redis-6.0.8.tar.gz
# cd redis-6.0.8
# make
编译通过后就可以在src/下找到redis相关命令了
./redis-server ../redis.conf 根据配置文件启动redis
./redis-cli -- 使用客户端测试
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> ping
PONG
find /* -name "install_*"

redis 模块

NETWORK  网络
TLS/SSL
GENERAL 一般
SNAPSHOTTING 快照
REPLICATION 复制
KEYS TRACKING 键跟踪
SECURITY 安全
CLIENTS 客户端
MEMORY MANAGEMENT 内存管理
LAZY FREEING 数据释放
THREADED I/O 线程I/O
KERNEL OOM CONTRO 内核
KERNEL transparent hugepage CONTROL
APPEND ONLY MODE 附加仅限模式
LUA SCRIPTING 抓取脚本
REDIS CLUSTE   集群
CLUSTER DOCKER/NAT support 集群Docker / NAT支持
SLOW LOG 慢日志
LATENCY MONITOR   延迟监视器
EVENT NOTIFICATION 活动通知
GOPHER SERVER Gopher服务器
ADVANCED CONFIG 高级配置
ACTIVE DEFRAGMENTATION 碎片整理

redis配置文件解释

篇幅过大,单独解释

redis编译报错

cd hiredis && make static
make[3]: 进入目录“/root/redis-6.2.6/deps/hiredis”
cc -std=c99 -pedantic -c -O3 -fPIC   -Wall -W -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers -g -ggdb alloc.c
make[3]: cc:命令未找到
make[3]: *** [alloc.o] 错误 127
make[3]: 离开目录“/root/redis-6.2.6/deps/hiredis”
make[2]: *** [hiredis] 错误 2
make[2]: 离开目录“/root/redis-6.2.6/deps”
make[1]: [persist-settings] 错误 2 (忽略)
  CC adlist.o
/bin/sh: cc: 未找到命令
make[1]: *** [adlist.o] 错误 127
make[1]: 离开目录“/root/redis-6.2.6/src”
make: *** [all] 错误 2

原因:缺少cc命令,安装gcc组件重新编译
yum -y install gcc
提示找不到文件或目录
In file included from adlist.c:34:0:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
#include <jemalloc/jemalloc.h>
                              ^
编译中断。
make[1]: *** [adlist.o] 错误 1
make[1]: 离开目录“/root/redis-6.2.6/src”
make: *** [all] 错误 2
执行make MALLOC=libc后问题解决。

redis配置

redis config命令格式、
获取配置
redis 127.0.0.1:6379>CONFIG GET CONFIG_SETTING_NAME
redis 127.0.0.1:6379> CONFIG GET loglevel
redis 127.0.0.1:6379>CONFIG GET * --获取所有配置
编辑配置
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"  --表头
2) "notice" -参数值
127.0.0.1:6379> CONFIG set daemonize no
(error) ERR Unsupported CONFIG parameter: daemonize  -- 不支持动态修改的参数
重点参数解释
#daemonize no --Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程(Windows 不支持守护线程的配置为 no )
#pidfile /var/run/redis.pid --当Redis以守护进程方式运行时,Redis 默认会把 pid写/var/run/redis.pid 文件,可以通过 pidfile 指定。
# port 6379 --指定 Redis 监听端口
#bind 127.0.0.1 绑定的主机地址
#timeout 300 当客户端闲置多长秒后关闭连接,如果指定为 0 ,表示关闭该功能
#loglevel notice --指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
#logfile stdout --日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给 /dev/null
#databases 16 --设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
#save <seconds> <changes> --指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
Redis 默认配置文件中提供了三个条件:save 900 1、save 300 10、save 60 10000 分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒内有 10000 个更改。
#rdbcompression yes --指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大。
#dbfilename dump.rdb --指定本地数据库文件名,默认值为 dump.rdb
#dir ./ 指定本地数据库存放目录
# slaveof <masterip> <masterport> --设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
#masterauth <master-password> --当 master 服务设置了密码保护时,slav 服务连接 master 的密码
#requirepass foobared --设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭
#maxclients 128 -设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
# maxmemory <bytes> --指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。
#appendonly no --指定是否在每次更新操作后进行日志记录,Redis 在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为 no。
#appendfilename appendonly.aof #指定更新日志文件名,默认为 appendonly.aof
# appendfsync everysec #指定更新日志条件,共有 3 个可选值:no:表示等操作系统进行数据缓存同步到磁盘(快);always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全);everysec:表示每秒同步一次(折中,默认值)。
#vm-enabled no --指定是否启用虚拟内存机制,默认值为 no,简单的介绍一下,VM 机制将数据分页存放,由 Redis 将访问量较少的页即冷数据 swap 到磁盘上,访问多的页面由磁盘自动换出到内存中。
#vm-swap-file /tmp/redis.swap -- 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享。
#vm-max-memory 0 --将所有大于 vm-max-memory 的数据存入虚拟内存,无论 vm-max-memory 设置多小,所有索引数据都是内存存储的(Redis 的索引数据 就是 keys),也就是说,当 vm-max-memory 设置为 0 的时候,其实是所有 value 都存在于磁盘。默认值为 0。
#vm-page-size 32 --Redis swap 文件分成了很多的 page,一个对象可以保存在多个 page 上面,但一个 page 上不能被多个对象共享,vm-page-size 是要根据存储的 数据大小来设定的,如果存储很多小对象,page 大小最好设置为 32 或者 64bytes;如果存储很大大对象,则可以使用更大的 page,如果不确定,就使用默认值。
#vm-pages 134217728 --设置 swap 文件中的 page 数量,由于页表(一种表示页面空闲或使用的 bitmap)是在放在内存中的,在磁盘上每 8 个 pages 将消耗 1byte 的内存。
#vm-max-threads 4 --设置访问swap文件的线程数,最好不要超过CPU的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4。
#glueoutputbuf yes --设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启。
#hash-max-zipmap-entries 64
#hash-max-zipmap-value 512
-- 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
#activerehashing yes --指定是否激活重置哈希,默认为开启
#include /path/to/local.conf -- 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

数据类型

string

一个 key 对应一个 value,可以包含任何数据。比如jpg图片或者序列化的对象,一个健最大能存储 512MB
######操作前已连接redis,长时间未操作,set后回显了保存过程
127.0.0.1:6379> set w "甘肃"  
OK
1636:M 07 Jan 2022 15:32:18.682 * 1 changes in 3600 seconds. Saving..3600秒的变化。 保存...
1636: 15:32:18.682 * Background saving started by pid 2428 通过PID 2428开始的背景保存
2428:C * DB saved on disk --db保存在磁盘上
2428:C * RDB: 0 MB of memory used by copy-on-write --RDB:编写副本使用0 MB内存
1636:M * Background saving terminated with success --保存背景终止了成功
#####
127.0.0.1:6379> set w "甘肃"
OK
127.0.0.1:6379> get w
"\xe7\x94\x98\xe8\x82\x83"  
127.0.0.1:6379> exit
[root@localhost src]# ./redis-cli --raw   --解决汉字显示问题
127.0.0.1:6379> get w
甘肃
redis-cli set w1 $(cat 2.txt) #在bash界面可直接操作,不一定需要进入客户端
redis-cli get w1 >wtl.txt    #将文件输出

Hash(哈希)

Redis hash 是一个键值(key=>value)对集合 ,适合存储对象,每个 hash 可以存储 232 -1 键值对(40多亿)w
#DEL w 删除key,1标识成功 0 标识失败
1
#127.0.0.1:6379> del c 删除不存在的key
0
#127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World" --设置两个field=>value 对,Hget获取对应value
OK
127.0.0.1:6379> HGET runoob field1
Hello
127.0.0.1:6379> HGET runoob field2
World

list(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),每个列表可存储40多亿。

[root@localhost src]# ./redis-cli --raw
127.0.0.1:6379> del w
0
127.0.0.1:6379> lpush w redis
1
127.0.0.1:6379> LPUSH w mongodb
2
127.0.0.1:6379> LPUSH w rabbitmq
3
127.0.0.1:6379> LRANGE w 0 10
rabbitmq
mongodb
redis

set(集合)

Redis 的 Set 是 string 类型的无序集合;

sadd 命令

添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。

127.0.0.1:6379> del w
1
127.0.0.1:6379> sadd w redis
1
127.0.0.1:6379> sadd w mongodb
1
127.0.0.1:6379> sadd w redis  --插入重复值返回0 ,重复插入会被忽略
0
127.0.0.1:6379> SMEMBERS w
mongodb
redis

zset(sorted set:有序集合)

zset和set一样不允许重复,但是zset每个元素都会关联一个double类型的分数,通过分数排序,分数可以重复

127.0.0.1:6379> del w
1
127.0.0.1:6379> zadd w 0 redis
1
127.0.0.1:6379> zadd w 0 mq
1
127.0.0.1:6379> zadd w 0 mysql
1
127.0.0.1:6379> zadd w 1 mysql1
1
127.0.0.1:6379> zadd w 0 mysql
0
127.0.0.1:6379> zadd w 0 mysql2
1
127.0.0.1:6379> ZRANGEBYSCORE w 0 10  --同分数按照插入顺序,不同按照大小
mq
mysql
mysql2
redis
mysql1

redis命令

redis-cli
[root@localhost src]# ./redis-cli --本地连接
127.0.0.1:6379> ping  --检测服务是否启动
PONG
[root@localhost src]# ./redis-cli -h 127.0.0.1 -p 6379 -a "123456" --远程连接
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. ## 提示使用'-a' 或'-u'选项输入密码不安全
AUTH failed: ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct? --验证失败,在没有配置默认密码的情况下调用,确认你设置密码了吗?
127.0.0.1:6379>
[root@localhost src]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
AUTH password  #验证密码是否正确
ECHO message  #打印字符串
SELECT index #切换指定数据库
INFO #获取redis服务器统计信息
BGSAVE #在后台异步保存当前数据库的数据到磁盘
CLIENT KILL [ip:port] [ID client_id]  #关闭客户端连接
127.0.0.1:6379> client kill 127.0.0.1:44122
OK
127.0.0.1:6379> CLIENT list
Error: Server closed the connection
CLIENT LIST #获取连接到服务器的客户端连接列表
CLIENT GETNAME #获取连接的名称
CLIENT PAUSE timeout  #制定时间内终止来自客户端的命令
CLIENT SETNAME connection-name   #设置当前连接名称
CLUSETR SLOTS #获取集群节点的映射数组
COMMAND #获取redis所有命令
COMMAND COUNT #获取redis命令总数
TIME #返回当前服务器时间
COMMAND INFO command-name #获取命令帮助
CONFIG GET parameter  #获取制定配置参数的值 配置参数查询
CONFIG REWRITE  #对启动redis服务器是所制定的redis.conf配置文件进行改写 ##redis动态修改参数后执行这个命令可以写入配置文件中
CONFIG SET parameter value #修改redis配置参数,无需重启
CONFIG RESETSTAT #重置INFO命令中某些统计数据
DBSIZE  #返回当前数据库的key的数量
DEBUG OBJECT key #获取key的调试信息
DEBUG SEGFAULT #让redis服务崩溃
FLUSHALL  #删除 所有 数据库所有key
FLUSHDB   #删除当前数据库的所有key
MONITOR #事实打印出redis服务器接收到的命令,调试用
ROLE #返回主从实例所属角色
SHUTDOWN [NOSAVE][SAVE] #关闭服务器并选择是否异步保存数据到硬盘
SLAVEOF host port #将当前服务器转变为制定服务器的从属服务器
SLOWLOG subcommand [argument] #管理redis慢日志
SYNC #用于复制功能的内部命令

redis 键(key)

DEL key #删除key
DUMP key  # 序列化给定 key ,并返回被序列化的值。 把对象转化为可传输的字节序列过程称为序列化,把字节序列还原为对象的过程称为反序列化。
#示例
127.0.0.1:6379> DUMP W  --区分大小写
(nil)
127.0.0.1:6379> DUMP w
"\x00\x03WTL\t\x00\x7f\xcc4\xb4\x019\xb6&"
EXISTS key #检查key是否存在
EXPIRE key seconds #给key设置过期时间,单位为秒
EXPIRE key timestamp #设置过期时间,参数为Unix时间戳
PEXPIRE key milliseconds /PEXPIRE key milliseconds-timestamp #设置过期时间 单位为毫秒
KEYS pattern  #查找所有符合给定模式的key
1) "w"
127.0.0.1:6379> SET w WTL
OK
127.0.0.1:6379> SET w2 WTL
OK
127.0.0.1:6379> keys w*
1) "w"
2) "w2
MOVE key db #移动当前数据库的key到指定数据库
PERSIST key  #去除key的过期时间,key将保持持久化
PTTL key /TTL key #已毫秒/秒为单位返回key的剩余过期时间
RANDOMKEY #从当前数据库随机返回一个key
RENAME key newkey  #修改key名称
RENAMENX key newkey #当newkey不存在时将key的名称重命名为newkey
SCAN cursor [MATCH pattern] [COUNT count]  #迭代数据库中的数据库键 cursor - 游标 pattern - 匹配的模式 count - 指定从数据集里返回多少元素,默认值为 10
TYPE key #返回key存储的值的类型
SAVE/BGSAVE. #备份还原
CONFIG GET dir #获取数据目录
CONFIG get requirepass #查询是否设置了密码验证
CONFIG set requirepass "password" #设置密码
AUTH password #密码验证
$ redis-benchmark [option] [option value]
常见参数标注:
-h 主机  -p 端口  -s socket  -c 并发数 -n 请求数  --csv 格式输出  

redis客户端连接

Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

  • 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。

  • 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法

  • 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送

redis-server --maxclients 100000  #启动时设置最大连接数

redis管道

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。

  • 服务端处理命令,并将结果返回给客户端。

redis分区

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

分区的优势

  • 通过利用多台计算机内存的和值,允许我们构造更大的数据库。

  • 通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。

分区的不足

redis的一些特性在分区方面表现的不是很好:

  • 涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。

  • 涉及多个key的redis事务不能使用。

  • 当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。

  • 增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。

分区类型:范围分区和哈希分区

config get slave-priority #查询

 

posted @ 2022-01-25 17:39  吴桐林  阅读(392)  评论(0)    收藏  举报