NoSQL(NoSQL=Not Only SQL),泛指非关系型的数据库
NoSQL 不依赖业务逻辑方式存储,而已简单的key-value模式存储,因此大大增加了数据库的扩展能力
不遵循SQL标准,有一套自己的操作标准
不支持ACID,(不是不支持事务,zhi'shi)
负载均衡:什么是负载均衡? - 知乎https://zhuanlan.zhihu.com/p/32841479
安装步骤:
sudo su 切换超级管理员账号
linux安装及操作
redis.io官网下载tar.gz包
然后打开linux,打开虚拟机,打开fz建立windows和linux连接,
安装 gcc环境 rpm -q gcc查看是否安装
sudo apt-get update 先更新
sudo apt-get install gcc 安装
sudo gcc --version
查看ssh是否开启,
dpkg -l | grep ssh 查看是否开启,
sudo apt-get install openssh-client 重新启动openssh-client
sudo apt-get install openssh-server 重新启动openssh-server
sudo apt-get install ssh 命令安装ssh
sudo /etc/init.d/ssh start 启动ssh
ifconfig 查看id地址,192.168.200.129(studytest)
输入ip地址,虚拟机用户名,密码。默认端口22,连接后
上传文件,
上传后,cd进入上传tar包的目录 ll 查看文件是否存在
存在就解压到指定路径
sudo cp redis-6.2.6.tar.gz /usr/lib/jvm 将文件复制到自定路径
tar -zxf redis-6.2.6.tar.gz 解压gz包
解压完后产看文件 ls(出现蓝色redis-6.2.6即解压成功)
cd进入redis-6.2.6文件编译
sudo apt install make 安装make命令 # version 4.2.1-1.2, or
sudo apt install make-guile 安装make命令 # version 4.2.1-1.2
sudo make PREFIX=/usr/local install
sudo make distclean 执行清理命令
sudo make test
编译后默认存放位置
cd /usr/local/bin phython3.8
ll
ll
安装好了
前端启动(不推荐,窗口关闭无法运行)
redis-server
修改redis.conf文件
cd /usr/lib/jvm/redis-6.2.6
将文件复制到指定文件
sudo cp /usr/lib/jvm/redis-6.2.6/redis.conf /etc/redis
查看文件
cd /etc/redis
sudo vi redis.conf
查找/daemonize 将no改成yes
(退出):wq(保存并退出):q!(强制退出,不保存)
权限不够还是咋地????
后端启动
sudo redis-server /etc/redis/redis.conf
查看启动信息
sudo ps -ef | grep redis
连接redis
sudo redis-cli
关闭
1.shutdown
2.exit
找到进程
sudo ps -ef | grep redis
输入kill -p 5780 命令
安装yum
sudo rpm -ivh --force --nodeps python-urlgrabber-3.9.1-11.el6.noarch.rpm
sudo rpm -ivh --force --nodeps yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
sudo rpm -ivh --fonce --nodeps yum-3.2.29-81.el6.centos .noarch.rpm yum-plugin-fastestmirror-1.1.30-41,el6.noarch.rpm
rpm -ivh --nodeps http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm
rpm -ivh --nodeps http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
rpm -ivh --nodeps http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-3.2.22-26.el5.centos.noarch.rpm
redis介绍
默认端口号6379(Merz)
默认有16个数据库,默认应用0号数据库
select 0 切换数据库 0可以是0到15
memcached与redis的区别
1.memcached支持数据类型单一
redis支持各种数据类型list、set等
2.memcached不支持持久化操作只能在内存中存储
redis即支持持久化操作也能在内存中存储
3.memcached使用多线程加锁的机制
redis使用单线程加多路IO复用的机制(能实现出多线程的效果,效率更高,效果更好)
redis常用五大数据类型
keys *查看当前库所有key (匹配:keys *)
exists key判断某个key是否存在
type key 查看你的key是什么类型
del key 删除指定的key数据
unlink key 根据value选择非阻塞删除(异步删除)
仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire key 10 10秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
select命令切换数据库
dbsize查看当前数据库的key的数量
flushdb清空当前库
flushall通杀全部库
String
String类型Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
常用命令
1、set 添加键值对
2、get 查询对应键值
3、append 将给定的 追加到原值的末尾
4、strlen 获得值的长度
5、setnx 只有在 key 不存在时 设置 key的值
6、incr 将 key 中储存的数字值增1只能对数字值操作,如果为空,新增值为1
7、decr 将 key 中储存的数字值减1只能对数字值操作,如果为空,新增值为-1
8、incrby / decrby 将 key 中储存的数字值增减。自定义步长。(原子性操作,不会被线程调度机制打断的操作)
9、mset ..... 同时设置一个或多个key-value对
10、mget .....同时获取一个或多个value
11、msetnx ..... 同时设置一个或多个key-value 对,当且仅当所有给定 key 都不存在。
原子性,有一个失败则都失败
12、getrange 获得值的范围,类似java中的substring,前包,后包
13、setrange 用 覆写所储存的字符串值,从开始(索引从0开始)。
14、setex 设置键值的同时,设置过期时间,单位秒。
15、getset 以新换旧,设置了新值同时获得旧值。
String的数据结构
简单的动态字符串,可以修改字符串中的值,内部结构实现上类似于Java的Arrylist,采用预分配
冗余空间来减少内u你的频繁分配
当长度超过len的长度会自动扩容,就是加倍现有的空间,超过1M,扩容一次只会多扩1M的空间,
可能之前的一倍,可能之前的0.5倍,小于1M,大于1M的扩容机制是不一样的,不管怎样最大长度为512M
List(单键多值)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
数据结构
List的数据结构为快速链表quickList。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next,Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余
常用命令
1、lpush/rpush .... 从左边/右边插入一个或多个值。
2、lpop/rpop 从左边/右边吐出一个值。值在键在,值光键亡。
3、rpoplpush 从列表右边吐出一个值,插到列表左边。
4、lrange 按照索引下标获得元素(从左到右)
5、lrange mylist 0 -1 0左边第一个,-1右边第一个,(0-1表示获取所有)
6、lindex 按照索引下标获得元素(从左到右)
7、llen 获得列表长度
8、linsert before 在的后面插插入值
9、lrem 从左边删除n个value(从左到右)
10、lset将列表key下标为index的值替换成value
Set(集合)
常用命令
1、sadd ..... 将一个或多个 member 元素加入到集合 key 中,已经存在的 member元素将被忽略
2、smembers 取出该集合的所有值。
3、sismember 判断集合是否为含有该值,有1,没有0scard返回该集合的元素个数
4、scard返回该集合的元素个数。
5、srem .... 删除集合中的某个元素。
6、spop 随机从该集合中吐出一个值。
7、srandmember 随机从该集合中取出n个值。不会从集合中删除 。
8、smove
value把集合中一个值从一个集合移动到另一个集合
9、sinter 返回两个集合的交集元素。
10、sunion 返回两个集合的并集元素。
11、sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)
Hash(哈希)
常用命令
1、hset 给集合中的 键赋值
2、hget 从集合取出 value
3、hmset ...批量设置hash的值
4、hexists 查看哈希表 key 中,给定域 field 是否存在。
5、hkeys 列出该hash集合的所有field
6、hvals 列出该hash集合的所有value
7、hincrby 为哈希表 key 中的域 field 的值加上增量 1 -1
8、hsetnx 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域field (字段)不存在 .
Zset(有序集合)
常用命令
1、zadd …将一个或多个 2、member 元素及其 score 值加入到有序集 key当中。
3、zrange [WITHSCORES] 返回有序集 key中,下标在之间的元素带WITHSCORES,可以让分数一和值返回到结果集。
4、zrangebyscore key minmax [withscores] [limit offset count]返回有序集 key 中,所有 score 值介于 min和 max 之间(包括等于 min或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
5、zrevrangebyscore key maxmin [withscores] [limit offsetcount] 同上,改为从大到小排列。
6、zincrby 为元素的score加上增量
7、zrem 删除该集合下,指定值的元素
8、zcount 统计该集合,分数区间内的元素个数
9、zrank 返回该值在集合中的排名,从0开始。
Bitmap
1、setbit设置Bitmaps中某个偏移量的值(0或1)*offset:偏移量从0开始。unique:users:20201106代表2020-11-06这天的独立访问用户的Bitmaps
2、getbit获取Bitmaps中某个偏移量的值,获取键的第offset位的值(从0开始算)
3、bitcount[start end] 统计字符串从start字节到end字节比特值为1的数量
4、bitop and(or/not/xor) destkey> [key…]bitop是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中
HyperLogLog
1、pfadd < element> [element ...] 添加指定元素到 HyperLogLog 中
2、pfcount [key ...] 计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV,计算一周的UV可以使用7天的UV合并计算即可
3、pfmerge [sourcekey...] 将一个或多个HLL合并后的结果存储在另一个HLL中,比如每月活跃用户可以使用每天的活跃用户来合并计算可得
Geospatial
1、geoadd< longitude>[longitude latitude member...] 添加地理位置(经度,纬度,名称)
2、geopos [member...] 获得指定地区的坐标值
3、geodist [m|km|ft|mi ] 获取两个位置之间的直线距离
4、georadius< longitude>radius m|km|ft|mi 以给定的经纬度为中心,找出某一半径内的元素
配置文件介绍
自定义目录:cd /etc/redis
查看文件:sudo vi redis.conf
MODULES
redis3.0的爆炸功能是新增了集群,而redis4.0就是在3.0的基 础上新增了许多功能,其中这里的 自定义模块配置就是其中之一。通过这里的 loadmodule 配置将引入自定义模块来新增一些功能。
GENERAL (通用)
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程,pidfile:配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面
daemonize no
当Redis以守护进程方式运行时,配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到/var/redis/run/redis_6379.pid 文件里面可以通过pidfile指定
pidfile /var/run/redis.pid
定义日志级别。默认值为notice,有如下4种取值:
debug(记录大量日志信息,适用于开发、测试阶段)
verbose(较多日志信息)
notice(适量日志信息,使用于生产环境)
warning(仅有部分重要、关键信息才会被记录)
loglevel verbose
配置log文件地址,默认打印在命令行终端的窗口上,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
设置数据库的数目。默认的数据库是DB 0 ,可以在每个连接上使用select 命令选择一个不同的数据库,dbid是一个介于0到databases - 1 之间的数值。默认值是 16,也就是说默认Redis有16个数据库。
databases 16
INCLUDES
指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
NETWORK (网络相关配置)
绑定的主机地址,绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的连接
bind 127.0.0.1
port:指定redis运行的端口,默认是6379。由于Redis是单线程模型,因此单机开多个Redis进程的时候会修改端口。作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
timeout:设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。默认值为0,表示不关闭。
timeout 300
tcp-keepalive :单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300s,如果设置为0,则不会周期性的检测。
tcp-backlog设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。在高并发环境下你需要一个高backlog值来避免慢客户端连接问题
protected-mode将本机访问保护模式设置no
如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应
SNAPSHOTTING
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存 save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存 save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbcompression yes
rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
设置快照的文件名,默认是 dump.rdb
dbfilename dump.rdb
设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。使用上面的 dbfilename 作为保存的文件名
dir ./
REPLICATION
slave-serve-stale-data:默认值为yes。当一个 slave 与 master 失去联系,或者复制正在进行的时候,slave 可能会有两种表现:
1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候
2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 "SYNC with master in progress" 的错误
slave-read-only:配置Redis的Slave实例是否接受写操作,即Slave是否为只读Redis。默认值为yes。
repl-diskless-sync:主从数据复制是否使用无硬盘复制功能。默认值为no。
repl-diskless-sync-delay:当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段 时间以期更多的从站到达。延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。默认值为5。
repl-disable-tcp-nodelay:同步之后是否禁用从站上的TCP_NODELAY 如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。 Linux内核默认配置情况下最多40毫秒的延时。如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。默认值为no。
SECURITY(安全)
rename-command:命令重命名,对于一些危险命令例如:
flushdb(清空数据库)
flushall(清空所有记录)
config(客户端连接后可配置服务器)
keys(客户端连接后可查看所有存在的键)
作为服务端redis-server,常常需要禁用以上命令来使得服务器更加安全,禁用的具体做法是是:
- rename-command FLUSHALL "" 也可以保留命令但是不能轻易使用,重命名这个命令即可:
- rename-command FLUSHALL abcdefg这样,重启服务器后则需要使用新命令来执行操作,否则服务器会报错unknown command。
requirepass:设置redis连接密码访问密码的查看、设置和取消
在命令中设置密码,只是临时的。重启redis服务器,密码就还原了,比如: requirepass 123 表示redis的连接密码为123.默认关闭,。
永久设置,需要再配置文件中进行设置
当master服务设置了密码保护时,slav服务连接master的密码
masterauth
LIMITS(限制)
maxclients :设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件。 描述符数-32(redis server自身会使用一些),如果设置 maxclients为0 。表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxmemory:指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区,设置Redis的最大内存,如果设置为0 。表示不作限制。通常是配合下面介绍的maxmemory-policy参数一起使用
maxmemory
maxmemory-policy :当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策略。有以下几种可以选择:
1)volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
2)allkeys-lru 利用LRU算法移除任何key
3)volatile-random 移除设置过过期时间的随机key
4)allkeys-random 移除随机ke
5)volatile-ttl 移除即将过期的key(minor TTL)
6)noeviction noeviction 不移除任何key,只是返回一个写错误 ,默认选项
maxmemory-samples :LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存)。随意你可以选择样本大小进行检,redis默认选择3个样本进行检测,你可以通过maxmemory-samples进行设置样本数。
APPEND ONLY MODE
指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。默认值为no。
no-appendfsync-on-rewrite no
默认值为100。aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
auto-aof-rewrite-min-size 64mb
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象 redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为 yes。
aof-load-truncated yes
LUA SCRIPTING
一个lua脚本执行的最大时间,单位为ms。默认值为5000.
lua-time-limit 5000
REDIS CLUSTER
cluster-enabled:集群开关,默认是不开启集群模式。
cluster-config-file:集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。 这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件。请确保与实例运行的系统中配置文件名称不冲突。默认配置为nodes-6379.conf。
cluster-node-timeout :可以配置值为15000。节点互连超时的阀值,集群节点超时毫秒数
cluster-slave-validity-factor :可以配置值为10。在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了, 导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
cluster-migration-barrier :可以配置值为1。master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
cluster-require-full-coverage:默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。 设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。