Redis

NoSQL概述

分类 相关产品 典型应用 数据模型 优点 缺点
键值(key-value) Tokyo Cabinet/Tyrant、Redis、Voldemort、BerkeleyDB 内容缓存,主要用于处理大量数据的高访问负载 一系列键值对 快速查询 存储的数据缺少结构化
列存储数据库 Cassandra、HBase、Riak 分布式的文件系统 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易进行分布式扩展 功能相对局限
文档型数据库 CouchDB、MongoDb Web应用(key-value类似,value是结构化的) 一系列键值对 数据结构要求不严格 查询性能不高,而且缺乏统一的查询语法
图形(Graph)数据库 Neo4J、InfoGrid、Infinite Graph 社交网络,推荐系统等。专注于构建关系图谱 图结构 利用图结构相关算法 需要对整个图做计算才能得出结果,不容易做分布式的集群方案

  NoSQL特点:易扩展、大数据量,高性能、灵活的数据模型、高可用

Redis概述

  高性能键值对数据库,支持的键值数据类型

  1. 字符串类型
  2. 列表类型
  3. 有序集合类型
  4. 散列类型
  5. 集合类型

  官方数据:50个并发程序执行10万次请求,Redis读的速度每秒11万次,写的速度每秒8.1万次。

Redis的应用场景

  缓存、网站访问统计、任务队列、数据过期处理、应用排行榜、分布式集群架构中的session分离

Redis的安装

windows下用github地址。官网最新版本不能用于windows

Redis下载地址github: https://github.com/MSOpenTech/redis/releases

      下载之后,进行解压,可以根据自己需要拷贝到相应系统盘目录。比如C盘。

 下面开始讲解4种安装和使用。学习时可用第一种

一.Redis临时服务

       进入Redis安装包目录,启动临时服务:redis-server.exe  redis.windows.conf

 

      备注:通过以上面命令,会创建Redis临时服务,不会在window Service列表出现Redis服务名称和状态,此窗口关闭,服务会自动关闭。(这个页面夯住,不能输入,要输入按下面的步骤)

 

    客户端调用: redis-cli.exe -h 127.0.0.1 -p 6379

二.Redis默认服务安装

      进入Redis安装包目录,注册服务:redis-server.exe --service-install redis.windows.conf --loglevel verbose

 

     备注:通过以上面命令,会在window  Service列表出现”Redis”服务,但此服务不是启动状态,需要调下面命令启动服务。

     启动服务:redis-server.exe  --service-start

 

     客户端调用: redis-cli.exe -h 127.0.0.1 -p 6379

     停止服务:redis-server.exe  --service-stop

 

     卸载服务: redis-server.exe  --service-uninstall

三.Redis自定义服务安装

      进入Redis安装包目录,注册服务:redis-server.exe --service-install redis.windows.conf --Service-name RedisServer1 --loglevel verbose

     备注:通过以上面命令,会在window  Service列表出现”redisserver1”服务,但此服务不是启动状态,需要调下面命令启动服务。

 

     启动服务:redis-server.exe  --service-start  --Service-name RedisServer1

 

     客户端调用: redis-cli.exe -h 127.0.0.1 -p 6379

 

    停止服务:redis-server.exe  --service-stop --Service-name RedisServer1

     卸载服务: redis-server.exe  --service-uninstall --Service-name RedisServer1

 

     备注:其实Redis自定义服务安装和默认服务安装,其实差不多的,唯一不同的就是在相应安装服务、启动、关闭、卸载服务时需要加上自定义Redis服务名。通过命令行卸载自定义服务后,电脑重启一下,卸载服务会全部完成。

四. Redis主从服务安装

      安装主从服务,其实就是把上面Redis安装文件包,拷贝到相应目录,修改主、从服务器配置文件中IP、Port,同时从服务器要指定主服务器 的IP、Port,按照Redis自定义服务安装中命令进行服务安装、服务启动、服务关闭、服务卸载即可使用。

     我本地主从服务器安装包都还是在D:Program Files (x86)目录,Redis-x64-3.2.100为主服务器中,用的本地IP:127.0.0.1,生产环境大家可以根据自己实际情况进行设置。

     主服务器redis.windows.conf修改如下:

      port  6379

     从服务器redis.windows.conf修改如下:

      port  6380

     slaveof  127.0.0.1  6379

     安装、启动主服务器:

 

     安装、启动从服务器:

 

     启动的主从服务:

 

     主服务器客户端调用: redis-cli.exe -h 127.0.0.1 -p 6379

 

     从服务器客户端调用: redis-cli.exe -h 127.0.0.1 -p 6380

 

     以上关于Window下四种安装相关到此完成。

简单尝试:

set name imooc
get name
keys *
del name
keys *

Redis的数据结构

五种数据结构

  1. 字符串(String)
  2. 字符串列表(list)
  3. 有序字符串集合(sorted set)
  4. 哈希(hash)
  5. 字符串集合(set)

Key定义的注意点:

  1. 不要过长,一般不要超过1024个字节,这不仅会消耗内存,还会降低效率
  2. 不要过短,降低 key 的可读性
  3. 在项目中,最好有统一的命名规范

存储String

  字符串在Redis中是以二进制的方式进行操作的,这就意味着该类型存入和获取的数据是相同的。value最多可以容纳的数据长度是512M。

String常用命令

赋值(注意,就算value是数字,本质上也是string)
set key value

取值
get key
getset key value 表示先获取原先的值,再把value改掉

删除
del key

数值增减
incr key    将指定的key的value递增1。如果没有该key-value,则把value设为0,由于执行了incr,所以结果为1。如果value不能递增,是hello这种,则该命令失败,抛出异常

decr key   表示递减

扩展命令
incrby key num   num表示增加数字,其余跟incr一样
decrby key num  递减

append key str   拼凑字符串,如果这个key存在,会在原有的value后追加str,如果不存在,设为str

存储Hash

  1. 可以看成String Key和String Value的map容器
  2. 一个Hash可以存储4294967295个键值对(2^32)
赋值
hset key field value
hmset key field1 value1 field2 value2

取值
hget key field
hmget key field1 field2
hgetall key  全部获取

删除
hdel key field1 field2
del key   整个删除

增加数字
hincrby key field num

自学
hexists key field  判断key中有没有field存在
hlen key  获取属性的数量,即有多少field
hkeys key  获得所有属性的名称
hvals key  获得所有的值,即value

存储list

  在Redis中,list的类型是按照插入顺序排序的一个字符串的列表,和数据结构中的普通链表是一样的。可以在它头部和尾部添加新的元素,在插入的时候,如果该键不存在,Redis就会为这个键创建一个新的链表。如果链表中的所有元素都被移除了,那么该键就被会删除。

  从元素的插入和删除的视角来看,如果我们是在链表的两头插入和删除元素,十分高效。就算链表中已经有百万条数据,这个操作也能在常量时间内完成。如果插入和删除的操作是作用在链表的中间的,这时候效率低。

ArraryList使用数组方式来存储数据,所以说根据索引去查询,速度非常快,但是新增和删除元素的时候需要涉及到位移操作,所以比较慢。

LinkedList使用双向链表方式来存储数据。每个元素都记录了前后元素的指针,所以插入和删除数据非常快。

双向链表中添加数据

双向链表中删除数据

常用命令

两端添加
lpush key a b c  从左边插入abc三个数据,先插入a,最后c
rpush key a b c 从右边插入abc三个数据,先插入a,最后c

查看列表
lrange key start end  需要查找的开始和结束的数字,可以0,也可以负数,-1表示最后一个

两端弹出
lpop key  弹出最左边元素,弹出后这个值被删除
rpop key 弹出最右边元素,弹出后这个值被删除

获取列表元素个数
llen key

扩展命令
lpushx key x 仅当我们参数中指定的key存在的时候,可以向关联的list的头部插入一个具体的值(这里是x),如果不存在不会进行插入。
rpushx key x 从右边插入

lrem key count value  会删除count个为value的元素。
如果 count > 0 ,会从头向尾遍历并删除 count 个为 value 的元素。
如果 count < 0 ,会从尾向头遍历并删除 -count 个为 value 的元素。
如果 count = 0 ,则删除list中所有为 value 的元素

lset key count value  在链表中的 count 位置新增一个value的值,0代表第一个元素,-1代表最尾的元素,不存在抛出异常

linsert key before value value2  在list 原来存在的 value 前面新增一个value2

linsert key after value value2  在list 原来存在的 value 后面新增一个value2

rpoplpush key1 key2  把key1最右侧元素弹出,并把这个元素插入到key2的最左侧

Redis链表经常会用于消息队列的一些服务,来完成多个程序之间的消息的交互。假设一个应用程序正在执行lpush向链表中添加新的元素,我们通常将这样的程序称为生产者,另外一个程序正在执行rpop操作,从链表中取出元素,我们称之为是消费者。那么与此同时,消费者程序在取出元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为这个消息已经丢失了,由此可能会导致业务数据的丢失,或者是业务状态的不一致等现象的发生。然而可以通过我们 rpoplpush 这个命令,消费者程序在主消息队列中取出元素之后,再将它插入到一个备份的队列当中,直到我们的消费者程序完成,正常的逻辑处理后,再将消息从备份队列中删除。这样的话我们可以提供一个守护的线程。当发现备份队列中的消息过期的时候,可以将它重新放回主消息的队列当中,以便其他的一些消费者可以继续处理。

rpoplpush的使用场景

存储Set

  和 List 类型不同的是,Set 集合中不允许出现重复的元素

  Set 可包含的最大元素数量是 4294967295

添加/删除元素
sadd key a b v 添加了 a b c
srem key a b  删除了 a b

获得集合中的元素
smembers key 可以得到set中所有元素
sismenber myset a  判断有没有指定的元素在 set 中。返回1表示存在,返回0表示不存在。

集合中的差集运算
sdiff key1 key2  结果为 key1 中有, key2 中没有的元素


集合中的交集运算
sinter key1 key2  结果为 key1 和 key2 中都有的元素

集合中的并集运算
sunion key1 key2

扩展命令
scard key  统计有几个元素
srandmenber key  随机的返回 key 中的一个元素
sdiffstore newkey key1 key2  把 key1 和 key2 的差集存储到newkey中
sinterstore newkey key1 key2  把 key1 和 key2 的交集存储到newkey中
sunionstore newkey key1 key2  把 key1 和 key2 的并集存储到newkey中

使用场景:跟踪具有唯一性的数据,比如访问某一博客的唯一IP地址。只需要在每次访问该博客的时候将访问者的IP存入到Redis当中,然后Set数据类型就会自动保证IP地址唯一性。

还可以维护数据对象的关联关系,比如所有购买某一个电子设备客户的ID被存储到一个指定的Set当中,而购买另外一种电子产品的客户的ID被存储到了另一个Set中。如果此时我们想获取有哪些客户同时购买了两个设备,就可以交集。

存储Sorted-Set

  Sorted-Set中的每一个成员都会有一个分数与之关联,Redis正是通过这个分数来为集合中的成员进行从小到大的排序。需要额外指出的是,尽管Sorted-Set中的成员必须是唯一的,但是分数是可以重复的,那么在Sorted-Set中添加、删除和更新一个成员都是非常快速的操作。时间复杂度为集合中成员的个数的一个对数。由于Sorted-Set的成员在集合中的位置是有序的,因此即便是访问集合中部的这些成员,也是非常高效的。

添加元素
zadd key 70 a 80 b 90 c
zadd key 100 a  这时候会替换原来的分数

获得元素
zscore key a  获得 a 的分数
zcard key  获得数量

删除元素
zrem key a b 删除 a 和 b

范围查询
zrange key 0 -1
zrange key 0 -1 withscores  同时显示分数,由小到大
zrevrange key 0 -01 withscores  同时显示分数,从大到小
zremrangebyrank mysort 0 4  按照排名范围进行删除
zremrangebyscore key 80 100  按照分数进行删除,80-100都删除


扩展命令
zrangebyscore key 0 100 不显示分数,只显示排名
zrangebyscore key 0 100 withscores 返回分数在某个区间的成员并按照分数的从低到高来进行排序
zrangebyscore key 0 100 withscores limit 0 2 只显示两个
zincrby key 3 a 给成员 a 的分数加3
zcount mysort 80 90  分数在80 - 90 之间的成员的个数

使用场景:大型在线游戏积分排行榜

构建索引数据

Keys的通用操作

keys *  获取所有的keys
keys my? 查看以my开头的keys。只查询到my1,不能查询到my11
del key1 key2 key3 删除keys
exists key  查看key是否存在,1表示存在,0表示不存在
rename key1 key2 重命名,把key1 改为key2
expire key 1000  设置过期时间,单位为秒
ttl key 查看过期时间,如果没有设置,返回-1
type key  获取指定key的类型

flushall清空数据库

Redis特性

多数据库:一个redis实例可以包含多个数据库。客户端可以指定连接redis实例的数据库。跟mysql一样。一个redis实例可以最多创建16个数据库,下标分别从0-15,默认连接0

select 1 表示选择1号数据库
move key 1 表示把key移动到1号数据库

事务:在事务中所有命令都将被串行化顺序执行,事务执行期间,Redis不会再为其他的客户端提供任何的服务,从而保证事务中的所有命令都被原子化执行。和关系型数据库中的事务相比,Redis中如果某一个命令执行失败,后面的命令还会被执行。

multi  开启
exec  提交
discard  回滚

Redis持久化

  Redis的高性能是由于它所有的数据都存储在内存当中,为了使Redis在重启之后仍然能保证数据不丢失,那就需要将数据从内存当中同步到硬盘上。这个过程称之为持久化操作。

两种持久化方式

RDB方式(默认)

在指定的时间间隔内,将内存中的数据集快照写入到磁盘。

AOF方式

以日志的方式记录服务器的每一个操作,在Redis服务器启动之初,读取文件并且执行。

无持久化

可配置不做持久化

同时使用RDB和AOF

RDB

优势:性能比较好,启动效率高

劣势:在定时持久化之前出现的宕机情况,数据会丢失。

配置:安装目录下,redis.conf(配置文件)

每900秒有一个key变化就持久化一次;

每300秒有10个key变化就持久化一次;

每60秒有10000个key发生变化就持久化一次;

保存文件及保存路径

AOF

优势:1.带来更高的数据安全性。有三种同步策略。每秒同步、每修改同步、不同步。
2.AOF 文件是一个只进行追加操作的日志文件,因此在写入过程中即使出现宕机现象也不影响之前已经存在的内容。
3.如果日志过大,redis可以启动重写机制。在重写过程中产生的对数据库操作记录会保存在一个新文件中,等到重写完成后再追加到现有的文件中。
4.AOF 文件有序地保存了对数据库执行的所有写入操作
劣势:1.对于相同数量的数据集而言,文件比rdb方式要大。
2.效率比rdb低 

  默认不使用这种方式,改成yes就行。并会产生一个日志文件。最后是修改每秒同步、每修改同步、不同步。

官网:https://redis.io/download

原文地址:https://www.cnblogs.com/dongye95/p/10896223.html