redis学习记录


redis简介

Redis:开源、免费、高性能、K-V数据库、内存数据库、非关系型数据库,支持持久化、集群和事务

Centos7 安装redis

Redis 连接时报错:Could not connect to Redis at 127.0.0.1:6379: Connection refused

redis Connection refused 远程连接错误

redis 密码设置

SSM 整合Redis

Redis开启

开启服务:

redis-server redis.conf

启动客户端:

redis-cli

重启redis:

sudo service redis restart

Redis关闭

第一种关闭方式:(断电、非正常关闭。容易丢失数据)
查询启动进程 根据要关闭的端口关闭相应服务

$ ps -ef | grep -i redis
    ···
$ Kill -9 PID

第二种方式(正常关闭、数据保存)
shutdown

key的命名建议

  1. key不要太长,尽量不要超过1024字节。不仅消耗内存,也会降低查找的效率
  2. key不要太短,太短可读性会降低
  3. 在一个项目中,key最好使用统一的命名模式,如user:123:password
  4. key区分大小写

redis常用命令

DEL key:删除指定key
DUMP key:序列化给定key,返回被序列化的值
EXISTS key:检查key是否存在
EXPIRE key second:为key设定过期时间
TTL key:返回key剩余时间
PERSIST key:移除key的过期时间,key将持久保存
KEY pattern:查询所有符号给定模式的key
RANDOM key:随机返回一个key
RANAME key newkey:修改key的名称
MOVE key db:移动key至指定数据库中
TYPE key:返回key所储存的值的类型
Select :切换到指定数据库(redis默认16个库,从0-15,使用时需要指定数据库-1)
DBSIZE :查看当前数据库的key的数量
Keys 查看当前数据库的所有key
FLUSHDB 删除当前数据库的所有key
FLUSHALL 删除所有数据库的所有key

redis数据类型

字符串类型string

概念

string类型是二进制安全的,redis的string可以包含任何数据,如图像、序列化对象。一个键最多能存储512MB。==二进制安全是指,在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来 ==

常用命令

Incr
语法:incr key
将key中的数字值加1,如果key不存在,则key的值先被初始化为0再执行incr操作(只能对数值类型数据操作)

Decr
语法:decr key
将key中的数字值减

Append
语法:decr key value
在value值后面追加,如果不存在,为其赋值

Strlen
语法: strlen key
返回key字符串的长度,如果key存在就返回长度,不存在就返回0

Getrange
语法:getrange key star end
获取key中字符串值从start开始到end的子串

Setrange
语法: setrange key offset value
用value替换key的存储的值从offset开始,不存在的key做空白字符串,返回修改后的字符串长度

Mset
语法:mset key value[key value…]
同时设置一个或多个key-value对

Mget
语法:mget key[key…]
获取给定key的所有值

应用场景

  1. String通常用于保存单个字符串或JSON字符串数据
  2. 因为String是二进制安全的,所以可以把保密要求高的图片文件内容作为字符串来存储
  3. 计数器:常规Key-Value缓存应用,如微博数、粉丝数。INCR本身就具有原子性特性,所以不会有线程安全问题

链表list

概念

Redis的list类型其实就是一个每个子元素都是string类型的双向链表,链表的最大长度是2^32。list既可以用做栈,也可以用做队列。类似于Java中的LinkedList。
list的pop操作还有阻塞版本,主要是为了避免轮询

常用命令

(1)lpush key value:把值插入到链表头部
(2)rpush key value:把值插入到链表尾部
(3)lpop key :返回并删除链表头部元素
(4)rpop key: 返回并删除链表尾部元素
(5)lrange key start stop:返回链表中[start, stop]中的元素
(6)lrem key count value:从链表中删除value值,删除count的绝对值个value后结束
       count > 0 从表头删除  count < 0 从表尾删除  count=0 全部删除
(7)ltrim key start stop:剪切key对应的链接,切[start, stop]一段并把改制重新赋给key
(8)lindex key index:返回index索引上的值
(9)llen key:计算链表的元素个数
(10)linsert key after|before search value:在key 链表中寻找search,并在search值之前|之后插入value
(11)rpoplpush source dest:把source 的末尾拿出,放到dest头部,并返回单元值
(12)brpop,blpop key timeout:等待弹出key的尾/头元素,timeout为等待超时时间,如果timeout为0则一直等待下去

应用场景

  1. 对数据大的集合数据删减
    列表显示、关注列表、粉丝列表、留言评价…分页、热点新闻等
  2. 任务队列
    list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样通过order by来排序。长轮询ajax,在线聊天等。

补充:
task + bak 双链表完成安全队列
业务逻辑: rpoplpush task bak
        接收返回值并做业务处理
         如果成功则rpop bak清除任务,如果不成功,下次从bak表取任务


哈希hash

概念

Redis hash 是一个string类型的field和value的映射表,它的添加、删除操作都是O(1)(平均)。hash特别适用于存储对象,将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。

常用命令

配置:hash_max_zipmap_entries 64 #配置字段最多64个
   hash_max_zipmap_value 512 #配置value最大为512字节
(1)hset myhash field value:设置myhash的field为value
(2)hsetnx myhash field value:不存在的情况下设置myhash的field为value
(3)hmset myhash field1 value1 field2 value2:同时设置多个field
(4)hget myhash field:获取指定的hash field
(5)hmget myhash field1 field2:一次获取多个field
(6)hincrby myhash field 5:指定的hash field加上给定的值
(7)hexists myhash field:测试指定的field是否存在
(8)hlen myhash:返回hash的field数量
(9)hdel myhash field:删除指定的field
(10)hkeys myhash:返回hash所有的field
(11)hvals myhash:返回hash所有的value
(12)hgetall myhash:获取某个hash中全部的field及value 

应用场景

Hash的应用场景,通常用来存储一个用户信息的对象数据。

  1. 相比于存储对象的string类型的json串,json串修改单个属性需要将整个值取出来。而hash不需要。
  2. 相比于多个key-value存储对象,hash节省了很多内存空间
  3. 如果hash的属性值被删除完,那么hash的key也会被redis删除

集合结构set

概念

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 Redis 中集合是通过哈希表实现的,set是通过hashtable实现的 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。 类似于JAVA中的 Hashtable集合,具有无序性、确定性、唯一性等特点

 

常用命令 

(1)sadd key value1 value2:往集合里面添加元素
(2)smembers key:获取集合所有的元素
(3)srem key value:删除集合某个元素
(4)spop key:返回并删除集合中1个随机元素(可以坐抽奖,不会重复抽到某人)   
(5)srandmember key:随机取一个元素
(6)sismember key value:判断集合是否有某个值
(7)scard key:返回集合元素的个数
(8)smove source dest value:把source的value移动到dest集合中
(9)sinter key1 key2 key3:求key1 key2 key3的交集
(10)sunion key1 key2:求key1 key2 的并集
(11)sdiff key1 key2:求key1 key2的差集
(12)sinterstore res key1 key2:求key1 key2的交集并存在res里 

应用场景

对两个集合间的数据[计算]进行交集、并集、差集运算

  1. 以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
  2. 利用唯一性,可以统计访问网站的所有独立 IP

有序集合zset

概念

它是在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动按新的值调整顺序。可以理解为有两列的mysql表,一列存储value,一列存储顺序,操作中key理解为zset的名字。

  当元素被添加到集合中时,一个元素到score的映射被添加到hashtable中,所以给定一个元素获取score的开销是O(1)。另一个score到元素的映射被添加的skiplist,并按照score排序,所以就可以有序地获取集合中的元素。添加、删除操作开销都是O(logN)和skiplist的开销一致,redis的skiplist 实现是双向链表,这样就可以逆序从尾部去元素。sortedset最经常使用方式应该就是作为索引来使用,我们可以把要排序的字段作为score存储,对象的ID当元素存储。有序且不重复。每个元素都会关联一个double类型的分数,Redis通过分数进行从小到大的排序。分数可以重复

常用命令  

(1)zadd key score1 value1:添加元素
(2)zrange key start stop [withscore]:把集合排序后,返回名次[start,stop]的元素 默认是升续排列 withscores 是把score也打印出来
(3)zrank key member:查询member的排名(升序0名开始)
(4)zrangebyscore key min max [withscores] limit offset N:集合(升序)排序后取score在[min, max]内的元素,并跳过offset个,取出N个
(5)zrevrank key member:查询member排名(降序 0名开始)
(6)zremrangebyscore key min max:按照score来删除元素,删除score在[min, max]之间
(7)zrem key value1 value2:删除集合中的元素
(8)zremrangebyrank key start end:按排名删除元素,删除名次在[start, end]之间的
(9)zcard key:返回集合元素的个数
(10)zcount key min max:返回[min, max]区间内元素数量
(11)zinterstore dest numkeys key1[key2..] [WEIGHTS weight1 [weight2…]] [AGGREGATE SUM|MIN|MAX]
      求key1,key2的交集,key1,key2的权值分别是weight1,weight2
      聚合方法用 sum|min|max
      聚合结果 保存子dest集合内

应用场景

常用于排行榜

  1. 如twitter 的public timeline可以以发表时间作为score来存储
  2. 存储成绩
  3. 还可以用zset来做带权重的队列,让重要的任务先执行

Java连接redis

导入Pom.xml依赖
redisPom.jpg

测试代码

public void test(){
String host="127.0.0.1";
int port=6379;
    Jedis jedis = new Jedis(host,port);
    jedis.auth("password");
    jedis.close();
} ```

# 发布订阅
    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。

命令:  
> subscribe channel [channel…]:订阅一个或多个频道的信息
> psubscribe pattern [pattern…]:订阅一个或多个符合规定模式的频道
> publish channel message :将信息发送到指定频道
> unsubscribe [channel[channel…]]:退订频道
> punsubscribe [pattern[pattern…]]:退订所有给定模式的频道

### 应用场景
  构建实时的消息系统,比如普通聊天、群聊等功能。
1. 博客网站订阅,当作者发布就可以推送给粉丝
2. 微信公众号模式

# 事务
## 事务操作命令
> Multi
> 语法:multi
> 标记一个事务的开始,事务内的多条命令会按照先后顺序被放进一个队列当中
>
> Exec
> 语法:exec
> 执行所有事务内的命令,事务被打断返回nil
>
> discard
> 语法:discard
> 取消事务,放弃执行事务块内的所有命令
>
> Watch
> 语法:watch key[key...]
> 监视一个或多个key,如果在事务执行之前这个key被其他命令所改动,那么事务将被打断
>
> Unwatch
> 语法:unwatch
> 取消watch命令对所有key的监视。如果在执行watch后 ,exec命令或discard命令先被执行了的话,那么就不需要再执行unwatch了

# 持久化
## RDB方式
    RDB方式持久化,需在redis.conf文件中配置即可,默认配置是启用的
  1.配置执行RDB生成快照文件的时间策略
对redis进行设置,让它在”n秒内数据集至少有M个key改动”这一条件被满足时,自动保存一次数据集
  配置格式:  save    
    Save 900 1        //每900秒(15分钟)至少1个key发生变化,产生快照
    Save 300 10        //每300秒(5分钟)至少10个key发生变化,产生快照
  Save 60 10000        //每60秒(1分钟)至少10000个key发生变化,产生快照
  2.Dbfilename:设置RDB的文件名,默认文件名为dump.rdb
  3.Dir:指定RDB文件的存储位置,默认是./当前目录

> 优点:保存速度、还原速度极快,适用于灾难备份
> 缺点:小内存的机器不适合使用。RDB机制符合要求就会照快照。

## AOF方式
    Redis每次接收到一条改变数据的命令时,它将把该命令写到一个AOF文件中(只记录操作,读操作不记录),到redis重启时,它通过执行AOF文件中所有的命令来恢复数据

实现方式:
AOF方式实现持久化,仅需要再redis.conf文件中配置即可    
  1.appendonly:默认是no,改成页数即可开启aof持久化    
  2.Appendfilename:指定AOF文件名,默认文件名为appendonly.aof    
  3.Dir:指定RDB和AOF文件存放的目录,默认是./    
  4.Appendfsync:配置项aof文件写命令数据的策略:
    No:不主动惊喜同步操作,而是完全交由操作系统来做(即每30秒一次),比较快但不是很安全
    Always:每次执行写入都会执行同步,慢一些但是比较安全。
    Everysec:每秒执行一次同步操作,比较平衡,介于速度和安全之间。这是默认项。
  5.auto-aof-rewrite-min-size:允许重写的最小AOF文件大小,默认是64M。当AOF文件大与64M时,开始整理AOF文件,去掉无用的操作命令。缩小AOF文件。

> 缺点:有些命令是多余的

# 主从复制
主从复制的作用主要包括:
    数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
    故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
    负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
    高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

## 容灾处理
当master服务出现故障,需手动将slave中的一个提升为master,剩下的slave挂至新的master上(冷处理:机械挂掉了,再处理)

命令:

Slaveof no noe 将一台slave服务器提升为master(提升某slave为master)
Slaveof 127.0.0.1. 6381 (将slave挂至新的master上)

```

高可用sentinel哨兵


文章作者: Hanair
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hanair !
 上一篇
springdata学习记录 springdata学习记录
springdata简介是Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。 相关概述ORM概述 ORM(Object-Relational Mapping) 表示
2020-03-23 Hanair
本篇 
redis学习记录 redis学习记录
redis简介Redis:开源、免费、高性能、K-V数据库、内存数据库、非关系型数据库,支持持久化、集群和事务 Centos7 安装redis Redis 连接时报错:Could not connect to Redis at 127.0
2020-03-21 Hanair
  目录