一些linux命令
重启redis
ps -ef | grep redis 找redis的进程号
kill -9 进程号
启动
redis-server /etc/redis.conf
也可以shutdown
redis-server了以后 就redis-cli进入客户端可以输命令了
搜索文件里的某个内容 vi以后 不进入插入模式 直接 / 后面跟要搜索的
复制文件
cp dump.rdb d.rdb 把dump.rdb复制一份 复制的文件名叫d.rdb
文件改名
mv d.rdb dump.rdb 把d.rdb改名为dump.rdb 命令用来为文件或目录改名、或将文件或目录移入其它位置。
显示文件的行号
::set nu
ll 和 ls 的区别
事务
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序执行,事务在执行的过程中,不会被其他客户端发送来的命令请求打断。
redis事务主要作用 串联多个命令防止别的命令插队
exec之后 事务就结束了 想放弃只能在组队阶段 也就是 执行了 multi 之后 exec之前
也就是说 discard表示的是组队失败
组队时有一个命令失败 所有命令都会失败
组队成功 执行时 有一个命令失败 不会影响其他命令
锁机制
乐观锁 悲观锁
CAS操作与ABA问题
CAS操作与ABA问题
cas compare and swap 比较和换 这是一个原子性操作
带版本号的 cas操作可以避免 ABA问题
秒杀全是问题
秒杀 他用了一个linux的工具 httpd-tools 来模拟并发
为什么会timeout呢 为什么会超卖呢 为什么会库存遗留呢
用连接池解决time out问题 用watch和事务 解决超卖问题 但这个又有库存遗留问题
我不懂 为什么连接池可以解决time out 为什么watch和事务就可以解决超卖
库存遗留是因为没有自旋 乐观锁对比不对这个线程就没有操作了 没有再去尝试???
他用lua脚本解决了库存遗留 为什么就能解决呢 lua脚本不就像一个悲观锁嘛 一个线程执行一个原子操作(减库存 添用户成功的id) 然后再轮到下一个线程??? 是这样嘛 那这样不就相当于悲观锁了
持久化
生成的.rdb 和 .aof 文件都是和redis启动的目录在同一级 因为我们是 redis-server /etc/redis.conf 启动的嘛 那生成的这两个文件就和 redis-server在同一级目录
RDB(默认这种持久化策略就是开启的)
RDB redis database 每隔一段时间 把当前的数据快照保存到磁盘
redis fork一个子进程 写时复制技术 往临时文件里面写东西 临时文件写好了就替换上一次的持久化文件
copy on write 读时共享 写时拷贝 快照持久化文件会默认保存在redis的启动目录中 默认持久化文件名 dump.rdb
redis.conf里可以设置 如果一段时间内有多少key发生了变化就保存一个rdb
比如下面这个 900秒内如果1个key变化 就保存一次 300秒内 10个key变化保存一次 20秒内3个key变化保存一次
就是说 我可能不到20秒 10秒我就改变了三个key 那也算是在20秒之内 那就存一个rdb 然后开启下一个20秒计时
他这个备份 只要文件名是dump.rdb默认的嘛 你把redis这个进程kill掉 再重启 只要有这个文件在 重启后的redis就有了dump.rdb里的内容
AOF(append only file 默认不开启)
需要在redis.conf里开启 appendonly yes
以日志的形式记录 写操作 只记录写操作(增删改)等改变内容的 指令 读操作不记录
异常恢复的意思是 如果aof文件损坏了 redis启动会失败 和aof文件同一级下还有一个 redis-check-aof 只要–fix这个文件就可以修复 aof文件
有人说 appendfsync everysec 不久相当于 RDB save 1 1 或者 save 1 10 不不不
AOF有一个重写机制