redis学习笔记

redis

第一章

1 安装到linux

1. 下载
2. 解压 tar -zxvf
3. 编译 makr
   先安装gcc yum -y install gcc
4. 安装make install
   把redis的安装目录下src中的可执行文件拷贝到/usr/local/path

2 启动服务

1. 前台启动 redis-server
2. 后台启动 redis-server &
3. 启动redis服务时 指定配置文件 redis-server redis.conf &

3 关闭服务

1. 通过kill 
   kill -9 pid
   ps -ef|grep redis 查看pid 或者 ps -aux| grep redis
2. 通过redis-cli shutdown
3. 若修改了port和ip
   redis-cli shutdown -h ip地址 -p 端口号

4 客户端相关

1. redis-cli redis客户端  是向服务端发送命令 并且显示redis服务处理结果
2. 如何启动? 
   先启动redis服务 然后输入 redis-cli
3. 默认端口号: 6379 默认连接本机127.0.0.1:6379
4. 指定端口连接
   redis-cli -p 端口号  连接127.0.0.1的指定端口号上的服务
5. 连接其他ip的redis服务
   redis-cli -h ip地址 -p 端口号
6. 退出客服端
   exit 或者quit 

5 基本命令知识

1. 测试redis服务性能
   linux终端中输入 redis-benchmark
2. 测试redis服务是否正常运行
   客户端中输入 ping 如果正常 返回PONG
3. 查看redis服务器的统计信息
   客户端中输入 info 查看全部redis服务器的统计信息
               info [信息段]  info replication
4. redis默认使用16个库
   redis 默认使用16个库 编号从0到15 使用编号来使用数据库  
   redis的数据库实例: 作用类似于mysql中的数据实例 但是redis中的数据库实例只能由reids服务来创建和维护 开发人员不能修改和自行创建数据库实例; 
   可以通过配置文件 指定redis自动创建的数据库个数 在redis.conf文件中database 16 理论上可以配置无限个
   redis的每一个数据库实例本身占用的储存空间是很少 所以不会造成储存空间浪费

1. 默认情况下链接0号数据库
   select index切换数据库 
2. 查看数据库中的key数量
   dbsize
3. 查看当前数据库中的key
   keys *        
4. 清空数据库
   flushdb
5. 清空所有数据库实例
   flushall
6. 查看redis中的配置信息
   所有 config get *         
   端口 config get port

7 redis特点

1. 支持数据持久化
2. 支持多种数据结构
3. 支持数据备份

第二章

1 redis五种数据结构

1. string 单key:单value 
   username:zs age:20 最大512M
2. list 单key:多个有序 
   contacts: 122223333,xx,xxx(有序存)
3. set 单key:多个无序 
   city:bj sh cq
4. hash 单key:对象(属性:值) (适合存储对象)
   student:id:1001,name:zs,age:20
5. set 单key:多个无序(无序存自己排序 不允许重复成员 每个元素都会关联一个分数 分数可以重复 redis会从小到大排序)
   city: cq 1000,bj 2000 

2 redis中的操作命令

2.1 key的操作命令
1. 查看数据库中的key: keys partten       注: * 匹配0个或者多个字符
										? 匹配1个字符
                                            [] 匹配里面的1个字符    
   查看数据库中所有的key: keys *     
   查看数据库中k开头的key: keys k*                    

2. 判断某个key在数据库中是否存在 
   exists key 如果存在返回1 不存在返回0 
   exists key1 key2 返回值是存在的key的数量
   exists k1
   exists k1 k3 k2
3. 移动指定key到指定的数据量实例 move key index
   move k 3
4. 查看指定key剩余生存时间 ttl key
   key不存在 返回-2
   key没有设置生存时间 返回-1
5. 设置key的最大生存时间 expire key seconds
   expire k2 20    设置k2 20秒
6. 查看失效时间 单位秒 -1不失效 -2为已失效
   ttl key
6. 查看指定key的数据类型 type key
   type k2
7. 重命名key rename key newkey
8. 删除key del key
   key k1
   key k1 k2 k3 返回值是实际删除的key的数量

2.2 string类型数据的操作命令
1. 将string类型的数据设置到redis中 set key value
   set name zhangsan
   若key已经存在则后来的value会覆盖以前的value
2. 从Redis中获取string类型的数据 get key
   get zhangsan
   若key不存在则 得到nil
3. 追加字符 append key value
   set name zhangsan
   append key 666
   返回值为追加的字符串长度
   若key不存在 则新创建一个key 并把追加的value设置为其key的value
4. 获取字符串数据的长度 strlen key
5. 将字符串中的数值进行加1运算 incr key
   返回key加1之后的数值
   若key不存在 首先设置一个key 初始化为0 然后进行incr运行 即为1
   要求key对应value必须是数值 否则报错
6. 将字符串中的数值进行减1运算 decr key

7. 将字符串中的数值进行加increment(任意值)运算  incrby key increment
   set n1 10
   incrby n1 10
   >> 20    
   若key不存在 首先设置一个key 初始化为0 然后进行incrby运行 即为increment           
8. 将字符串中的数值进行减increment(任意值)运算  decrby key increment
9. 截取字符串中的子字符串  getrange key start end
   set k1 abcde
   getrange k1 0 3
   >> "abcd"
   getrange k1 1 3
   >> "bcd"
   整数下标从左至右 0 1 2 ...
   负数下标从右至左 -1 -2 ...
10. 用value覆盖从下标为startIndex开始字符串 value长度为多少则可以覆盖多少  setrange key startIndex value
   返回值为修改之后的字符串长度
   set name zhangsan
   setrange name 5 oooo
   >> 9
   get name
   >> zhangoooo
   
   setrange name 5 ii
   >> 9
   get name
   >> zhangiioo
11. 设置字符串数据的同时设置最大生命周期 
  setex key seconds value
12. 设置string类型的数据value到数据库中 当key不存在时才能设置成功 key存在则放弃设置 
  setnx key value
13. 批量将string类型的数据设置到redis中 
  mset k1 v1 k2 v2 k3 v3
14. 批量从Redis中获取string类型的数据 
  mget k1 k2 k3
15. 批量设置string类型的数据value到数据库中 当(所有)key不存在时才能设置成功 (只要有1个)key存在则放弃设置
  msetnx k1 v1 k2 v2 k3 v3
2.3 list类型数据的操作命令
# 单个key:多个有序value 多个value按照放入的顺序排序 起始下标为0 最后一个下标为-1
1. 将1个或者多个值一次插入到列表的表头(左侧) lpush key value [v2 v3 v4 ...]
   lpush list1 1 2 3 4   ==>  4 3 2 1 
                          下标0 1 2 3
   lpush list1 4 5 =========> 5 4 3 2 1 
                          下标0 1 2 3 4 
2. 获取指定列表中指定下标区间的元素:  lrange key start stop
    127.0.0.1:6379> lrange list1 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
3. 将1个或者多个值一次插入到列表的表尾(右侧) rpush key value [v2 v3 v4 ...]
   rpush list2 a b c d   ===>  a b c d
                           下标0 1 2 3
4. 从指定列表中移除表头元素
   lpop key 返回值表头元素
   lpop key [count]  可以指定删除的个数count
5. 获取列表中指定下标的元素
   lindex key index
6. 获取指定列表的长度
   llen key
7. 从指定列表中移除表尾元素
   rpop key 返回值表尾元素
   rpop key [count]  可以指定删除的个数count
8. 根据count值移除指定列表中和value相等的数据 lrem key count value 
   count > 0 从列表的左侧移除count个和value相等的数据
   count < 0 从列表的右侧移除count个和value相等的数据
   count = 0 从列表中移除所有和value相等的数据
   lpush list3 a a b c d d a b a 结果: a b a d d c b a a
   lrem list3 2 a    			结果: b d d c b a a
   lrem list3 -2 a 				结果: b d d c b
   lrem list3 0 d 				结果: b c b
2.4 set类型数据的操作命令
# 单key:多个无序value value之间没有顺序 并且不能重复 通过业务数据直接操作集合
1. 将1个或者多个元素添加到指定集合中
  sadd key member [member ...]
  若元素已经存在 则会忽略
2. 获取指定集合中所有的元素 
   smembers key
3. 判断指定元素在集合中是否存在
   sismember key member
   存在: 返回1
   不存在: 返回0
4. 获取指定集合的长度
   scard key
5. 移除指定集合中1个或者多个元素
   srem key member [member ...]
   不存在的元素会被忽略
   返回成功移除个个数
6. 随机获取指定集合中一个元素 
   srandmember key
   srandmember key [count]  随机获取指定集合中count个元素 
   							count>0 元素之间不重复 
   							count<0 元素之间可能重复
7. 从指定集合中随机移除一个或多个元素
   spop key 
   spop key [count]
8. 将source集合中的member元素移动到destination中
   smove source destination member

9. 获取第一个集合中有 但是其他集合中没有的元素组成的新集合(差集)
   sdiff key [key ...]   
10. 获取所有指定集合中都有的元素组成的新集合(交集)
   sinter key [key ...]
11. 获取所有指定集合中所有的元素组成的大集合(并集)
   sunion key [key ...]
2.5 hash类型数据的操作命令
1. 将1个或者多个field-value对设置到hash表中 
   hset key field value [field value ...]
   hset stu001 id 1001
   hset stu001 name zhangsan age 20
   若key中的field已经存在 则value会把以前的值覆盖掉
2. 获取指定哈希表中指定field的值 
   hget key field
3. 批量设置field-value对设置到hash表中    等同于hset
   hmset key field value [field value ...]
4. 批量获取指定哈希表中的field的值 
   hmget key field [field ...]
   hmget stu001 id name age
5. 获取指定哈希表中所有的field和value hgetall key
   hgetall key
   hgetall stu001
6. 从指定哈希表中删除1个或者多个field 
   hdel key field [field ...]
   hdel stu001 name age
7. 获取指定哈希表中所有的field个数
   hlen key
   hlen stu001
8. 判断指定哈希表中是否存在某一个field 
   hexists key field
   hexists stu001 name
9. 获取指定哈希表中所有的field列表
   hkeys key
   hkeys stu001
10. 对指定哈希表中指定field值进行整数加法运算 
   hincrby key field increment
   hincrby stu001 age 5      对stu001 中的age进行加5 
11. 对指定哈希表中指定field值进行浮点数加法运算 
   hincrbyfloat key field increment
12. 将一个field-value对设置到哈希表中 当key中field已经存在时则放弃设置 当不存在时设置filed-value 
   hsetnx key field value
2.6 zset类型数据的操作命令
# 有序集合(无序放 有序存) 本质上是集合 所有的元素不可以重复; 
# 每一个元素都关联一个分数 redis会根据分数对元素进行自动排序; 
# 分数可以重复; 既然有序集合中每一个元素都有顺序 那么也都有下标; 
# 有序集合中元素的排序规则又和列表中的元素的排序规则不一样
1. 将1个或者多个member及其score值加入有序集合
   zadd key score member [score member ...]
   zadd stu002 20 z1 30 z2 40 z3
   若元素member存在 再次添加会覆盖该元素的分数
2. 获取指定有序集合中指定下标区间的元素
   zrange key startIndex endIndex
   zrange key startIndex endIndex withscores  带获取的元素并附带分数
3. 获取指定有序集合中指定分数区间的元素
   zrangebyscore key startIndex endIndex withscores
4. 删除指定有序集合中1个或者多个元素
   zrem key member [member ...]
5. 获取指定有序集合中所有元素的个数
   zcard key
6. 获取指定有序集合中分数在指定区间内的元素的个数
   zcount key min max
7. 获取指定有序集合中指定元素的排名(排名从0开始  从小到大)
   zrank key member
8. 获取指定有序集合中指定元素的排名(排名从0开始  从大到小)
   zrevrank key member
9. 或者指定有序集合中指定元素的分数
   zscore key member

第三章

1 redis配置文件

在reids根目录下提供redis.conf配置文件
1. redis配置文件中关于网络的配置
   port: 指定redis服务所使用的端口 默认6379
   bind: 配置客户端连接redis服务时 所能使用的ip地址 默认可以使用redis服务所在的主机上任何一个ip都可以
   一般情况下 都会配置一个ip 而且通常使用真实ip
   若配置了port和bind则客户端连接redis服务时 必须指定端口号和ip
   	redis-cli -h 192.168.22.12 -p 6379
2. 常规配置
   loglevel: 配置日志级别  (log4j) 开发阶段可以设置成debug 生产阶段通常设置为notice或者warning
   logfile: 指定日志文件 redis在运行过程中 会输出日志信息 默认情况下 这些日志信息会输出控制台; 
       我们可以配置logfile配置文件 使redis把日志信息输出到指定文件中  
       如果不指定 redis只进行标准输出 要保证日志文件所在的目录必须存在 文件可以不存在;还要在redis启动是指定所使用的配置文件 否则不起作用
   logfile "mylog.log"
   databases: 配置redis数据库个数 默认是16
3. 安全配置
   requirepass: 配置reids的访问密码 默认不配置密码 即访问不需要密码验证 
   此配置项需要在protected-mode=yes时起作用 使用密码登录客户端
   	redis-cli -h ip -p 6379 -a pwd

2 redis的持久化

redis提供持久化策略 在适当的时机采用适当手段把内存中的数据持久化到磁盘中 每次redis服务启动时 都可以把磁盘上的数据再次加载内存中使用
2.1 RDB策略
# 在指定时间间隔内redis服务执行了指定次数的写操作 两者同时满足会自动触发一次持久化操作

自己配置
1. save <seconds> <changes>    
   RDB策略是redis默认的持久化策略redis 服务开启时这种持久化策略就已经默认开启了
2. dffilename: 配置redis持久化数据生成的文件名 默认是dump.rdb也可以自己配置
3. dir: 配置持久化文件目录		默认是 ./
2.2 AOF策略
# 采用操作日志来记录每一次的写操作(效率低 默认不开启)
每次redis服务启动时 都会重新执行一遍操作日志中的指令
1. appendonly: 配置是否开启AOF yes开启 no关闭 默认是no
2. appendfilename: AOF保存文件名
3. appendfsync: AOF异步持久化策略
   always: 同步持久化 每次发生数据变化 立刻写入到磁盘中 性能较差 但数据保存完成
   everysec: 出厂默认推荐 每秒异步记录一次 默认值
   no: 不及时同步 有操作系统决定何时同步
4. no-appendfsync-on-rewrite: 重写时是否运用appendsync 默认是no 可以保证数据的安全性
5. auto-aof-rewrite-percentage: 设置重写的基准百分比
6. auto-aof-rewrite-min-size: 设置重写的基准值

总结
根据数据的特点 来决定开启哪种持久层策略
一般情况开启RDB足够了 

3 redis事务

事务: 把一组数据库放在一起执行 保证操作的原子性(要么同时成功 要么同时失败)
Redis事务: 
	允许在把一组redis命令放在一起执行 把命令进行序列号 然后一起执行 保证部分原子性
1. multi 	用来标记一个事务的开始
2. exec 	用来执行事务队列中所有的命令
3. redis只能保证部分原子性
	a 如果一组命令中 有在压入队列过程中发生错误的命令 则本事务中所有的命令都不执行 能够保证事务的原子性
		multi
		set k1 v1
		setaaa k2 v3   这种错误则上面都不能执行
		exec
	b 如果一组命令 在压入队列过程中正常 但是在执行事务队列命令发生了错误 则只会影响错误的命令 不会影响其他命令的执行 不能够保证事务的原子性
		multi 
		set k3 v3
		incr k1    # 语法错误  运行时报错
		set k4 v4
		exec
4. discard 清除(放弃)已经压入队列的命令 并且结束整个事务
    multi
    set k5 v5
    set k6 v6
    discard  # 放弃执行k6 v6
    exec
5. watch 监控某一个键 当事务在执行过程中 此键代码的值发生变化 则本事务放弃执行; 否则正常执行
	set version 1
	
	watch version
	multi
    set k5 v5
    set k6 v6
    discard  # 放弃执行k6 v6
    exec

6. unwatch 放弃监控所有的键 、
    set version 1 

    watch version
    ...
    unwatch
    multi
    set k5 v5
    set k6 v6
    discard  # 放弃执行k6 v6
    exec

4 redis消息的发布和订阅

redis客户端订阅频道 消息的发布者往频道上发布消息 所有订阅此频道的都能够接受到信息
1. subscribe 订阅一个或者多个频道的信息
   subscribe channel [channel ...]、
2. publish 将消息发布到指定频道
   publish channel message 
3. 订阅一个或者多个频道的信息 频道名字支持通配符 *              
   psubscribe pattern [pattern ...]

第四章

1 redis的主从复制

主机数据更新后根据配置和策略 自动同步到从机的master/slave机制 master以写为主 slave以读为主

2 redis的一主二从

1. 配从(库)不配主(库)
2. 配从(库) slaveof 主库ip 主库端口
3. 主写从读 读写分离

3 搭建一主二从集群步骤

搭建三个redis服务
1. 使用一个redis模拟三台redis服务
2. 提供三个redis配置文件 redis6379.conf redis6380.conf redis6381.conf 
   bind 127.0.0.1
   pidfile /var/run/redis_6379.pid
   dbfilename 6379.rdb
   logfile "6379.log"
   dbfilename 6381.rdb
3. 启动
   redis-server redis redis6379.conf &
   redis-server redis redis6380.conf &
   redis-server redis redis6381.conf &
4. 通过redis客户端分别连接三台服务器
   redis-cli -h 127.0.0.1 -p 6379
   redis-cli -h 127.0.0.1 -p 6380
   redis-cli -h 127.0.0.1 -p 6381
5. 查看三台redis服务在集群中的角色
   info replication 
   默认情况下 所有的redis服务都是主机 都可以读和写 但是都还没有从机
6. 先测试   
   set k1 v1
7. 设置主从关系 设从不设主
   在6380上执行 slaveof 127.0.0.1 6379
全量复制 一旦主从关系确定 会自动把主库已有的数据同步复制到丛库中
增量复制 主库写数据 会自动同步到丛库中

主写从读 读写分离 从库中set k1 v1 会报错

主机宕机  从机原地待命
主机恢复  一切恢复
从机宕机  主机少一个从机连接 其他不变
从机恢复  需要重新设置主从关系 在从机上执行 slaveof
从机上位 
   1. 主机宕机 从机原地待命
   2. 从机断开原来的主从关系
     在从机上执行slaveof no one
   3. 重新设置主从关系
     在另一台从机上执行slaveof 设置
   4. 之前的主机恢复、变成孤家寡人
   5. 天堂变成地狱
     设置主从关系 变成从机
  • 小结
一台主机配置多台从机 一台从机又可以配置多台从机 从而形成一个庞大的集群结构
减轻一台主机的压力 但是增加了服务间的延迟时间

4 redis的哨兵模式

主机宕机、从机上位的自动版
1. 搭建一主二从集群架构
2. 提供哨兵配置文件 redis_sentinel.conf
	在redis安装目录下配置文件 redis_sentinel.conf
	sentinel monitor dc-redis 127.0.0.1 6379 1
3. 启动哨兵服务 
   redis-sentinel redis_sentinel.conf
   
...
关闭主机服务之后  会自动在从机中选举主机

原来的主机恢复之后 会变成后来主机的从机

5 小结

1. 查看主从复制关系的命令 info replication
2. 设置主从关系命令 slaveof 主机ip 主机port
3. 开启哨兵模式命令 redis-sentinel sentinel.conf
4. 主从复制原则 开始是全量复制 之后都是增量复制
5. 哨兵模式三大任务 监控 提醒 自动故障

第五章

jedis

Jedis jedis = new Jedis("127.0.0.1","6370");
String ret = jedis.ping();
jedis.set("k1","v1")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值