********************操作用户********************************
su root --登录root用户
sudo passwd root --更改root用户密码
********************安装解压********************************
wget 路径名称 --通过网络下载
-zxvf XXX.tar.gz --解压文件
make --安装
cp 文件名 路径名 --copy文件到选择的路径下
********************操作文件********************************
rm -rf * --删除文件夹下的所有文件,而不删除文件夹本身
rm -rf 路径名称 --删除该目录以及以下所有文件
mkdir 文件夹名 --创建一个文件夹
********************vi模式**********************************
/*
**推测 i(insert) w(write) q(quit) !(强制)
*/
vim XX.txt --进入txt,vi模式
shift+$ --查看txt
i --vi模式下,按下i(insert),可以编辑文件
:wq! --vi模式下,保存并退出
:w --vi模式下,保存不退出
:q --vi模式下,不保存退出
:set nu --vi模式下,显示行数
/要模糊查询的文本 --vi模式下,文本的模糊查询
********************操作进程********************************
ps -ef --显示所有进程信息
ps -ef|grep 进程 --(常用组合)查找指定进程
********************Redis操作****************************************
redis-benchmark --测试redis的性能
redis-server redis.conf --通过redis.conf配置文件启动redis
redis-cli -p 6379 --进入redis命令行(开始操作redis)
ping --进入redis命令行后测定连接是否存活(成功返回PONG)
set KEY VALUE --进入redis命令行后设置key,value键值对
get KEY --进入redis命令行后通过KEY取VALUE值
quit --退出连接
dbsize --查看一共有多少key
keys * --展现所有的key
key n? --?代表一个占位符,表示查找n开头,且后面有一个字符的key
key n?? --?代表一个占位符,表示查找n开头,且后面有两个字符的key
flushdb --清空当前库的所有数据
flushall --清空所有库的所有数据(注:如果使用table自动匹配,因为ALL的首字母是A,所以会优先匹配flushall)
***key类型相关的命令符
keys * --展现所有的key
keys n? --?代表一个占位符,表示查找n开头,且后面有一个字符的key
keys n?? --?代表一个占位符,表示查找n开头,且后面有两个字符的key
exists key名 --判断该key是否存在(返回的是integer)
move key名 第n个数据库 --把key移到其他的数据库
expire key名 秒 --设置key的过期时间
ttl key名 --查看key还有多长时间过期(-1代表永不过期,-2代表已经过期,ttl(time to leave))
// //数据过期之后生命周期结束会被删除,keys *,get key 都查不到
set key名 两次操作后,前面的value被后来赋值的value所覆盖
***String类型相关的命令符
set key名 value值 --设置key
get key名 --获取key
del key名 --删除key
append key名 String串 --给key添加字符串
strlen key名 --测量key的长度大小
incr key名 --key值+1,注:key的value必须为数字
decr key名 --key值-1,注:key的value必须为数字
incrby key名 数字n --key值+n,注:key的value必须为数字
decrby key名 数字n --key值-n,注:key的value必须为数字
getrange key名 数字n 数字m --类似substring,把角标n到角标m的value值取出来(角标从0开始算)
setrange key名 数字n String串 --类似substring,用String串替代从角标n开始的字符串(角标从0开始算)
setex key名 数字n value值 --setex(set with expire)设置key,value的同时设置他的生命周期
setnx key名 value值 --setnx(set if not exist)设置key.value的同时判断他是否存在,存在则添加失败,不存在则添加
mset key名 value值 key名 value值--m(more)同时设置多对key,value。
mget key名 key名 key名 --m(more)同时获取多个key的value
msetnx key名 value值 ..... --m(more)同时设置多对key,value。如果其中一个是已经存在的key那么集体失败
getset key名 value值 --先拿到key名对应的value,再设置一个新的value
***List类型相关的命令符
lpush list名 [value..] --l(left)设置list集合,其值从右向左排序,如果该list集合已存在,值会从最左边加上
rpush list名 [value..] --r(right)设置list集合,其值从左向右排序,,如果该list集合已存在,值会从最右边加上
lrange list名 --取得list集合
lpop list名 --取出,并删除list集合最左边一个值
rpop list名 --取出,并删除list集合最右边一个值
lindex list名 角标n --获取list集合从上到下(也是从左到右)角标为n的值
llen list名 --获取list集合的长度
lrem list名 数字n value值 --批量删除list集合中的n个value值,如果n超过该list集合所拥有的value则删除所有的该value值,如果发现没有该value值则返回0
ltrim list名 数字n 数字m --截取list集合中角标从n到m的value值,并将得到范围的值替代原来的list集合
rpoplpush list1 list2 --从list1的最右边(也是下面)取出一个值,放在list2的最左边(也是上面)
lset list名 数字n value --用该value代替list集合中角标为n的value
linsert list名 before v1 v2 --在list的集合的v1值前面插入一个v2值(其他值不变)
linsert list名 after v1 v2 --在list的集合的v1值后面插入一个v2值(其他值不变)
***Set类型相关的命令符
sadd sad名 v1 v2 .... --添加一个set集合,如果value输入的有重复value则算一个,而不会报错
smembers set名 --获取set集合中所有的value
sismember set名 value值 --判断set集合中有没有该value值,有返回1,否则为0(si类读see,s为set)
scard set名 --获取set集合中的value个数
srem set名 v1 v2... --删除集合中的元素,可以是批量删除
srandmember set名 数字n --在set集合的value中随机取出n个(set rand member)
spop set名 数字n --随机出栈,取出set集合中随机选取的n个value,显示然后删除(n可以不写,默认为1)
smove set1 set2 value值 --把set1中的value值传到set2中
sdiff set1 set2 --差级,获取set1中有的,但是set2中没有的元素
sinter set1 set2 --交集
sunion set1 set2 --并集
***Hash类型相关的命令符 //hash类似于map,是key value类型,只是这里的value是一个键值对(key value)
hset hash名 key名 value值 --创建一个hash。
hget hash名 key名 --获取hash里面的某个key的值
hmset hash名 k1 v1 k2 v2 ... --创建一个hash的同时,赋予多个kv键值对
hmget hash名 k1 k2 ... --获取一个hash的k1,k2...等多个value
hgetall hash名 --获取一个hash的所有key和value(注:所有的key,value然后一个key,下一个是value这样的排列)
hdel hash名 key名 --删除hash中的一个key,如果要删除整个hash的话直接del hash名就行
hlen hash名 --获取hash的长度
hexists hash名 key名 --判断hash中是否有某个key名,有则1,否则0
hkeys hash名 --获取hash中所有的key名
hvals hash名 --获取hash中所有的value值
hincrby hash名 key名 数字n --对hash中的某个key的value进行数字n的增加
hincrbyfloat hash名 key名 数字n --对hash中的某个key的value进行数字n的增加(类型float)
hsetnx hash名 key名 value值 --添加hash中的一个kv键值对,如果有则为0,没有则添加
***Zset类型相关的命令符 //相当于hash。score只能为数字
zadd zset名 s1 v1 s2 v2... --添加一个zset,并为其多个score和value赋值
zrange zset名 数字n 数字m --遍历zset集合中角标n到m的value值(注:这是没有score的)
zrange zset名 n m withscores --遍历zset集合中角标n到m的value和score值
zrangebyscore zset名 n m --获取score在n到m区间的value值 (代表不包含 (60 (90 //大于60且小于90
--可以在后面加上withscores 不光显示value还显示score
--后面加上limit limit n m ,从结果中进一步筛选,显示m个从角标n(包括)开始往后算的结果
zrem zset名 value值 --删除zset中的某个value和对应的score
zcard zset名 --统计zset集合中的元素个数(score,value算一对)
zcount zset名 mix max --统计zset集合中score在mix到max区间的个数
zrank zset名 value值 --获取zset集合中value值对应的角标
zscore zset名 value值 --获取zset集合中value值对应的score
************************************************************
Redis默认端口是6379
Redis命令行中的命令是可以用table自动补全的
********************Redis.conf******************************
Redis只支持bytes不支持bit,且对大小写不敏感
Redis可以通过include,增加其他的配置文件
config get requirepass --在redis命令行下,查看redis的密码
config set requirepass "XXX" --在redis命令行下,设置redis密码,XXX为密码内容,且设置后会立即生效
auth XXX --在redis命令行下,设置redis密码后,需要打出密码才能进行下一步操作
config get dir --在redis命令行下,查看数据库存放目录
Maxmemory-policy --redis.conf下面的当缓存达到最大时候的策略
volatile-lru --使用LRU算法移除key,只针对设置了过期时间的键
allkeys-lru --使用LRU算法移除key
volatile-random --在过期集合中随机移除key,只针对设置了过期时间的键
allkeys-random --随机移除key
volatile-ttl --移除那些ttl最小值的key,既即将过的key
noeviction --不进移除,只是返回错误信息
LRU算法:Least Recently Used,最近最久未使用法。
基于最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用的理论
会有一种淘汰机制,每次从内存中找到最久未使用的数据丢弃,然后存入新数据。
它的主要衡量指标是使用的时间,附加指标是使用的次数。
它的合理性在于优先筛选热点数据,所谓热点数据,就是最近最多使用的数据
********************Redis持久化*****************************
RDB:
默认规则:
1分钟 1W次
5分钟 10次
15分钟 1次 (保存的数据越勤,生成备份dump.rdb的频率越高)
注:RDB虽然会根据策略来生成dump.rdb文件,但是在你flushall和shutdown的时候会切断内存并迅速生成一个新的dump.rdb文件
dump恢复策略:
在fork根据RDB规则生成dump.rdb后,需要备份机复制一份dump.rdb。在机器出故障的时候,再将rdb文件覆盖回来。
如果等不及RDB规则的情况下想保存并生成dump.rdb -->输入save就可以了
save:save时只管保存,其他不管,全部阻塞
bgsave:redis会在后台异步进行快照操作,过程中还能响应客户端。可以通过lastsave获取最后一次执行快照的时间
优点:能够大规模的恢复数据
缺点:不能保证数据的完整性和一致性,他容易丢失最后一次数据(在还没有备份的时候出现问题导致无法备份)
fork的时候会产生两倍的消耗。
AOF:
默认规则:
默认是关闭的
appendonly no
以日志的形式记录每个操作,且只追加文件不修改文件。当redis启动时候如果有append文件会自动读取。
如果redis在操作时候,由于突然断电等不可抗力因素导致redis不能识别的命令进入append文件,重启时候会报错。
这时候可以使用redis-check-aof进行修复(redis-check-rdb同理)
在同时开启(拥有)rdb和aof的时候,redis会先加载aof文件进行恢复
Appendfsync:always 同步持久化,数据很重要时使用,但是相当于复制,性能差
: everysec 异步操作,每秒记录,有可能会损失一秒的数据,性能好
rewite:重写,指的是aof文件在由于命令越来越多,文件大小越来越大的情况下。aof会在达到一定的阈值(配置中设置)
的时候进行重写,aof将重新读取一遍redis的数据(这样就没有重复没用的命令了)而不是参考上一个aof文件,重新生成一个aof
命令: bgrewriteaof
********************Redis事务*******************************
redis的事务在创建后所有的操作都会进入一个队列,一次性,顺序性,排他性
multi 开启事务
exec 执行事务
discard 取消事务
watch 监视key
如果在事务中,有一个执行命令报错(注:编译错误,类似非RuntimeException),事务可以继续编写,但是执行时会全部失败
如果在事务中,有一个执行命令部队(注:运行错误,类似RuntimeException),事务可以继续编写,且在执行时候只有那个命令失败,其他成功
当在开启事务之前,watch了一个或几个key。如果在事务执行的过程中,有人去更改了watch监视的key值。那么事务全部失败。
需要出来更新数据才行(CAS check and set 也就是乐观锁的一种)
如果在事务的时候对敏感数据进行操作,但是前面没有watch的时候。其他人去修改了数据值,事务一样会执行不会报错。
且数据会变成修改后的数据再进行事务操作(我只试了一次)
但是这样的话会比较危险。。。。敏感数据,当然是money了
悲观锁:认为在你操作数据的时候,一定有其他人会对数据进行操作,所以在你操作数据的时候会进行表锁,行锁等。
(一般的数据库都是悲观锁,例如Oracle,如果你一直不commit那么其他的操作要一直等着,直到commit然后释放锁)
乐观锁:认为你在操作数据的时候,没有其他人会对数据进行操作,然后可以使用版本号等机制进行判断,策略是:提交版本必须大于版本才能更新
乐观锁适用多人操作,可以提高吞吐量
(一般数据库不支持乐观锁,需要编写代码实现。例子就是github和svn都是乐观锁,平时也是乐观锁比较多)
********************主从复制*********************************
Master/Slaver
1.配置从机,不配置主机。使用slaveof 主库ip 端口
(主从复制,一旦将其设置为从机,则会将主机所有的信息全部备份。无论是设置之前还是之后)
(主从复制,一旦将其设置为从机,也就相当于权限降低了,失去写的权限,只能复制主机和读取)
(主从复制,如果主机倒了,从机会原地待命,状态由up-->down,且当主机重新开启,他们的主从关系会重新连接。但是如果从机道理,则需要重新设置)
info replication 展示redis的主从信息
slaveof 127.0.0.1 6379 设置从机
去中心化:从一台机器挂九台机器,变成一台机器挂三台,三台后面各跟三台。分担主机压力
反客为主:redis也这么做的(slaver后面连接一个slaver,中间的从机身份还是slaver,因为他还是没有写的权限)
slaveof no one 提升从机的身份重新变成主机
复制原理:当从机连接到主机时,会发送一个sync命令。主机接到命令后启动后台存盘进程,收集所有数据发给slaver
第一次连接是全量复制(slaver全部保存),后面则变为增量复制(以添加的形式保存)
哨兵模式:反客为主的自动版,当主机倒了的时候会通过投票随机取一个slaver变成master
touch sentinel.conf
1. 在配置文件的目录下新建一个sentinel.conf文件
vim sentinel.conf
sentinel monitor master名 ip地址 端口号 n
wq!
2.配置哨兵, n代表谁的票数大于n就成为主机(一般为1)
redis-sentinel sentinel.conf
3.启动哨兵
注:哨兵选取需要一定时间,监控也需要一定时间。
注:当以前的master复活后,那么会转变身份。变成新master的slaver
缺点:延迟
**************************************************************
Redis
遇到的坑:
1.bash: redis-sever: command not found...
Failed to search for file: Cannot update read-only repo
运行redis-server时候碰到的,这是因为redis-server不是全局变量。
所以要到redis 5.0.5/src下输入该命令才能被找到识别
2.E325: ATTENTION Found a swap file by the name ".redis.conf.swp"
打开redis.conf配置文件的时候报错。
因为上次关闭的时候是强制关机,或其他原因导致的。
所以输入ls -a 查看所有文件,然后rm .redis.conf.swp 删除即可