Redis

191 阅读6分钟

Redis

redis是内存数据库,但可持久化写入磁盘
redis的常用使用场景:
1.缓存
2.排行榜
3.计算器/限速器
4.好友关系
5.简单的消息队列
6.session共享
分布式数据库CAP原理:
 传统的关系型数据库事务具备ACID:
  1.A:原子性
  2.C:一致性
  3.I:独立性
  4.D:持久性
 分布式数据库的CAP:
   1.C:强一致性(所有节点在同一时间的数据完全一致)
   2.A:高可用性(服务一直可用)
   3.P:分区容错性(某节点或网络分区故障时,仍然能够对外提供满足一致性或可用性的服务)
    CAP理论:P是常态ca不可共存,三者不可共存,可用性和一致性是一对冤家
       因此根据CAP原理将nosql数据库分成了满足CA原则、满足CP原则和瞒足AP原则
       CA:单点集群
       CP:瞒足一致性
       AP:瞒足可用性 
           
   查看网络相关信息:netstat -nptl
安装:
1.安装(要有网)gcc:yum -y install gcc(可用gcc -v 查看gcc版本)
2.进入redis进行编译(检查):make
3.编译之后开始安装:make install
***启动在:/usr/local/bin/redis-server
修改配置文件:
1.vim /opt/redis-6.2.3/redis.conf
2.改为(查找daemonize /来查) daemonize yes(来能后台启动)
3.在启动:redis-server  /usr/redis-6.2.3/redis.conf
检测6379端口是否在监听 netstat -lntp |grep 6379
关闭redis:redis-cli shutdown(单实例关闭)
         redis-cli -p 6379 shutdown(多实例关闭)
检测后台进程是否存在:ps -ef|grep redis
连接redis:redis-cli
redis一共有16个数据库(0-15):select 15(切换15号数据库)
数据库键值的数量:dbsize
清空当前库:flushdb
模糊查询:查询所有key:keys *
         查询k开头的所有key:keys k*
         查询1尾的所有key:keys *1
         包含k条件:keys *k*
         
 单个字符:key k?
 []:[ae]可能是a也可能是e
 
 
 ttl key:查看键还有多久过期(-1永不过期,-2已过期):
 为键设置过期时间: expire k1 10(设置10秒)
 查看键的数据类型:type keyname
String类型:
set/get
del(删)
apend k1 abc(往k1中追加数据abc)
strlen(看长度)
getrange k1 0 3(查询k1的值范围下标是0-3包含(0和3))
setrange k1 1 xxx(替换k1的值从下标1开始)
setex k1 5 v1(添加数据的时候同时设置生命周期)
setnx(添加数据的时候判断是否已经存在,防止已存在的被覆盖掉)
mset(添加多个数据)
mget(查找多个数据) 
msetnx(添加判断是否存在)
getset k6 v6(先取看是否存在在添加)
List(有序):
push(加)  pop(出 移除)
lpush/rpush (l左r右)  lpush list01 1 2 3 4 5
***查询数据 l list01 0 -1
    
lpop list01 (移除一个数据1没了)
lindex list01 2(为3 根据下标查询数据从左向右)
llen(返回集合长度)
lrem(删除n个value)   lrerm lsit01 2 3 (移除23)
ltrim(截取指定范围的值,别的全扔掉)    
rpoplpush list01 list02(从一个元素到另一个元素右出一个左进一个)
lset(改变某个下标的值)
linsert(插入元素)    linsert before 2 java(从左边第2个元素之前插入元素java)
SET集合(与java中的set类似不允许重复)sadd/smembers/sismember(添加/查看/判断是否存在)sadd set01 1 2 3  scard获得集合中的元素个数srem:删除集合中的元素(srem set01 2)srandemember set01 5(随机获取5个元素)spop(随机移除一个元素)smove set01 set02 3(将set01中的元素3移动到set02中)     sinter(交集) sunion(并集) sdiff(差集 sdiff set02 set01 在set02中存在在set01中不存在)    
Hash:类似java中的hashmap*****kv不变但v为键值对hset/hget/hmset/hmget/hgetall/hdel(添加/得到/多添加/多得到/得到全部/删除属性)hlen student(得到属性个数)hexists(判断元素是否存在某个属性 hexists student name)hhkeys student(获得所有属性的key)hvals student(获得属性的所有value即属性的内容)hsetnx(添加是否存在)
Zset(有序集合zset)zadd/zrange(withscores)(添加/查询)(zadd myset 1 one)(zrange zset01 0 -1 withscores)zrangebyscore(模糊查询 (不包含   limit跳过几个截取几个)zrem(删除元素)zrevrank(逆序找下标)zrevrange(逆序查询)zrevrangebyscore(逆序范围查找 先写大值)
持久化:RDB(在指定时间间隔内,将内存中的数据集的快照写入存盘  默认保存在/usr/local/bin中文件名为dump.rdb。每次关机会将数据备份到该文件中)vim edis.conf    /SNAP索搜 shutdown会自动备份每次save会自动备份(手动备份)        AOF:以日记的形式记录每个操作,将redis执行过程的写指令全部记录下来(读操作不记录),只允许追加不可改写文件开启aof:1.找/appendoly        2.appendonly yes            appendfilename  appendonly.aof    3.重启redis    4.如编辑这个文件最后要wq!两种优先选择aof    redis-check-aof --fix appendonly.conf(来修复aof不符合规范的代码)    
事务:redis不保证原子性    multi:可以理解为事务中的begin    exec:可以理解为事务中的commit    discard:可以理解为事务中的rollback
witch监控:监控了进行该监控事件会失效类似乐观锁发布订阅:subscribe(subscribe ctv1 CCTV2                  publish cctv1 nba  发送消息给cctv1会订阅到)
主从复制(就是redis集群的策略 配从库不配主库(小弟可以选大哥,大哥不能选小弟),读写分离(主机写从机读) ):1.开启防火墙 2.在redis.conf中索搜bind修改ip 0.0.0.03.info replication(查看角色)4.清空数据库 flushdb,在第一台添加值 mset k1 v1 k2 v25.找主:slaveof ip地址 6379主机可以写从机不能写只能读    主机挂了从机还是从机    从机挂了主机不变,该从机回来自己变为主机了    血脉想传     主机挂了从机谋权:slaveof no one (主机在回以没从机)
哨兵模式(sentinel):自动版的谋权,老大挂了重新选(实现高可用)1.每一台服务器创建一个配置文件 sentinel.conf   (在redis的bin中 vim sentinel.conf)编写:sentinel monitor redisxxx ip地址 6379 12. 开新窗口开启哨兵:redis-sentinel sentinel.conf3. 老大挂掉后后台会产生激烈的投票4.主机在归来几秒后进入集体变为从机  
redis是单线程的所以命令也具有原子性