Redis

Redis学习(尚硅谷版)

1.Nosql

1.1Nosql是什么?

NOSQL=not only a sql(不仅仅是sql),也被称作非关系型数据库。用于指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系

在nosql数据库中数据是毫无联系的,无关系的。

数据结构是松散的,可变的。

1.2为什么使用Nosql?

1.2.1关系型数据库的瓶颈

高并发读写需求

网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈

海量数据的高效率读写

网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的

高扩展性和可用性

在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。

对网站来说,关系型数据库的很多特性不再需要了

事务一致性

关系型数据库在对事物一致性的维护中有很大的开销,而现在很多web2.0系统对事物的读写一致性都不高

读写实时性

对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后才看到这条动态是完全可以接受的

复杂SQL,特别是多表关联查询

任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品阶级角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能极大的弱化了

在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性,我们必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储一个格式化的数据结构。每个元组字段的组成都是一样,即使不是每个元组都需要所有的字段,但数据库会为每个元组分配所有的字段,这样的结构可以便于标语表之间进行链接等操作,但从另一个角度来说它也是关系型数据库性能瓶颈的一个因素

1.2.2为什么使用nosql

1.易扩展

NoSQL数据库种类繁多,但是一个共同的特定都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展,也在无形之间,在架构层面上带来了可扩展的能力。

2.大数据量高性能

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。

3.多样灵活的数据模型

NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。

1.2.3传统RDBMS VS NOSQL

RDBMS

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

1.2.4非关系型数据库的缺点

(1) 无关系,数据之间是无联系的。

(2) 不支持标准的 SQL,没有公认的 NoSQL 标准

(3) 没有关系型数据库的约束,大多数也没有索引的概念

(4) 没有事务,不能依靠事务实现 ACID.

(5) 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)

1.3传统模型vsnosql模型

1.3.1 传统模型

在这里插入图片描述

1.3.2 nosql

{
 "customer":{
   "id":1136,
   "name":"Z3",
   "billingAddress":[{"city":"beijing"}],
   "orders":[
    {
      "id":17,
      "customerId":1136,
      "orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}],
      "shippingAddress":[{"city":"beijing"}]
      "orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}],
      }
    ]
  }
}

2.Redis

2.1Redis是什么?

redis是一个key-value存储系统。*

支持存储的value类型多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)

这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

在此基础上,支持各种不同方式的排序。

为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

什么是主从同步?

数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助

2.2安装Redis

2.2.1 Window上安装Redis

官方只维护了3.2版本
下载链接
下载zip
启动
双击 redis-server.exe 启动 Redis
若失败
在命令行(cmd)中按如下方式执行:

redis-server.exe redis.windows.conf

2.2 Linux上安装Redis

2.3.Redis相关操作

2.3.1 开启Redis

前台启动

redis-server

后台启动

redis-server &

根据配置文件启动 启动命令 配置文件 &

redis-server  redis.conf&

2.3.2 关闭Redis

使用redis客户端关闭,向服务器发出关闭命令

redis-cli shutdown

kill pid 或者 kill -9 pid
这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
先使用 ps -ef | grep redis 查出进程号,在使用 kill pid

ps -ef | grep redis
kill pid

或者

 kill -9 pid

2.4.Redis客户端

Redis客户端是一个程序,通过网络连接到Redis服务器,从而实现跟 Redis服务器的交互。
Redis客户端发送命令,同时显示Redis服务器的处理结果。

2.4.1 redis-cli

redis-cli(Redis Command Line Interface)是Redis自带的基于命令行的Redis客户端,用于与服务端交互,我们可以使用该客户端来执行redis的各种命令。

2.4.1.1 启动Redis客户端

1)直接连接redis (默认ip127.0.0.1,端口6379):redis-cli
在任意目录执行 redis-cli
此命令是连接本机127.0.0.1 ,端口6379的redis
在这里插入图片描述

2)指定IP和端口连接redis:redis-cli –h 127.0.0.1 -p 6379
-h redis主机IP(可以指定任意的redis服务器)
-p端口号(不同的端口表示不同的redis应用)
在这里插入图片描述

在任意目录下执行 redis-cli -h 127.0.0.1 -p 6379

2.4.1.2 退出Redis客户端:
exit

或者

quit

2.4.2 Redis基础知识

2.4.2.1 测试Redis性能
redis-benchmark
2.4.2.2 Redis沟通命令,查看状态

redis >ping 返回PONG
解释:输入ping,redis给我们返回PONG,表示redis服务运行正常

2.4.2.3查看redis服务器的统计信息:info

语法:info [section]
作用:以一种易于解释且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。section 用来返回指定部分的统计信息。 section的值:server , clients ,memory等等。不加section 返回全部统计信息
返回值:指定section的统计信息或全部信息

2.4.2.4 redis默认使用16个库

Redis默认使用16个库,从0到15。 对数据库个数的修改,在redis.conf文件中databases 16,理论上可以配置无限多个。
Redis的库和关系型数据库中的数据库实例类似,但又有一些不同,比如redis中各个库不能自定义命名,只能用序号表示,redis中各个库不是完全独立的,使用时最好一个应用使用一个redis实例,不建议一个redis实例中保存多个应用的数据。Redis实例本身所占存储空间其实是非常小的,因此不会造成存储空间的浪费。

2.4.2.5 切换库命令

select [index]

2.4.2.6 查看当前数据库中key的数目

语法:dbsize
作用:返回当前数据库的 key 的数量。
返回值:数字,key的数量

2.4.2.7 查看当前数据库中有哪些key
keys *
2.4.2.8 清空当前库
flushdb
2.4.2.9 清空所有数据库
flushall
2.4.2.10 获得redis的所有配置值
config get *

获取数据库个数

config get databases

获取端口号

config get port

2.5 Redis的5种数据结构

A、字符串类型 string
字符串类型是Redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数
据,序列化后的数据,JSON化的对象甚至是一张图片。最大512M。
B、列表类型 list
Redis列表是简单的字符串列表,按照插入顺序排序,元素可以重复。你可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构。
C、集合类型 set
Redis的Set是string类型的无序无重复集合。
D、哈希类型 hash
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
E、有序集合类型 zset (sorted set)
Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。

2.6 Redis的Key的操作命令

2.6.1keys

语法:keys pattern
作用:查找所有符合模式pattern的key. pattern可以使用通配符。
通配符:

  • *:表示0或多个字符,例如:keys * 查询所有的key。
  • ?:表示单个字符,例如:wo?d , 匹配 word , wood
  • [] :表示选择[]内的一个字符,例如wo[or]d, 匹配word, wood, 不匹配wold、woord

2.6.2 exists

语法:exists key [key…]
作用:判断key是否存在
返回值:整数,存在key返回1,其他返回0。使用多个key,返回存在的key的数量。

2.6.3 move

语法:move key db
作用:移动key到指定的数据库,移动的key在原库被删除。
返回值:移动成功返回1,失败返回0.

2.6.4 ttl

语法:ttl key
作用:查看key的剩余生存时间(ttl: time to live),以秒为单位。
返回值:

  • 1 :没有设置key的生存时间, key永不过期。
  • 2:key不存在

2.6.5 expire

语法:expire key seconds
作用:设置key的生存时间,超过时间,key自动删除。单位是秒。
返回值:设置成功返回数字 1,其他情况是 0 。

2.6.6 type

语法:type key
作用:查看key所存储值的数据类型
返回值:字符串表示的数据类型

  • none (key不存在)
  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)

2.6.7 rename

语法:rename key newkey
作用:将key改为名newkey。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
当 newkey 已经存在时, RENAME 命令将覆盖旧值。

2.6.8 del

语法:del key [key…]
作用:删除存在的key,不存在的key忽略。
返回值:数字,删除的key的数量。

2.7 字符串类型

字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。
字符串类型的数据操作总的思想是通过key操作value,key是数据标识,value是我们感
兴趣的业务数据。

2.7.1 set

语法:set key value
功能:将字符串值 value 设置到 key 中,如果key已存在,后放的值会把前放的值覆盖掉。
返回值:OK表示成功

2.7.2get

语法:get key
功能:获取 key 中设置的字符串值
返回值:key存在,返回key对应的value;
key不存在,返回nil

2.7.3append

语法:append key value
功能:如果 key 存在,则将 value 追加到 key 原来旧值的末尾
如果 key 不存在,则将key 设置值为 value
返回值:追加字符串之后的总长度(字符个数)

2.7.4strlen

语法:strlen key
功能:返回 key 所储存的字符串值的长度
返回值:如果key存在,返回字符串值的长度;
key不存在,返回0

2.7.5incr

语法:incr key
功能:将 key 中储存的数字值加1,如果 key 不存在,则 key 的值先被初始化为 0 再执行incr操作。
返回值:返回加1后的key值

2.7.6 decr

语法:decr key
功能:将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作。
返回值:返回减1后的key值

2.7.7 incrby

语法:incrby key offset
功能:将 key 所储存的值加上增量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 INCRBY 命令。
返回值:返回增量之后的key值。

2.7.8 decrby

语法:decrby key offset
功能:将 key 所储存的值减去减量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 DECRBY 命令。
返回值:返回减量之后的key值。

2.7.9 getrange

语法:getrange key startIndex endIndex
功能:获取 key 中字符串值从 startIndex 开始到 endIndex 结束的子字符串,包括startIndex和endIndex, 负数表示从字符串的末尾开始,-1 表示最后一个字符。

2.7.10 setrange

语法:setrange key offsetIndex value
功能:用value覆盖key的存储的值从offset开始。
返回值:修改后的字符串的长度。

2.7.11 setex

语法:setex key seconds value
功能:设置key的值,并将 key 的生存时间设为 seconds (以秒为单位) ,如果key已经存在,将覆盖旧值。
返回值:设置成功,返回OK。

2.7.12 setnx

语法:setnx key value
功能:setnx 是 set if not exists 的简写,如果key不存在,则 set 值,存在则不设置值。
返回值:设置成功,返回1
设置失败,返回0

2.7.13 mset

语法:mset key value [key value…]
功能:同时设置一个或多个 key-value 对
返回值:设置成功,返回OK。

2.7.14 mget

语法:mget key [key …]
功能:获取所有(一个或多个)给定 key 的值
返回值:包含所有key的列表,如果key不存在,则返回nil。

2.7.15 msetnx

语法:msetnx key value[key value…]
功能:同时设置一个或多个 key-value 对,如果有一个key是存在的,则设置不成功。
返回值:设置成功,返回1
设置失败,返回0

2.8 列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序,左边(头部)、右边(尾部)或者中间都可以添加元素。链表的操作无论是头或者尾效率都极高,但是如果对中间元素进行操作,那效率会大大降低了。
列表类型的数据操作总的思想是通过key和下标操作value,key是数据标识,下标是数据在列表中的位置,value是我们感兴趣的业务数据。

2.8.1 lpush

语法:lpush key value [value…]
功能:将一个或多个值 value 插入到列表 key 的最左边(表头),各个value值依次插入到表头位置。
返回值:插入之后的列表的长度。

2.8.2 rpush

语法:rpush key value [value…]
功能:将一个或多个值 value 插入到列表 key 的最右边(表尾),各个 value 值按依次插入到表尾。
返回值:插入之后的列表的长度。

2.8.3 lrange

语法:lrange key startIndex endIndex
功能:获取列表 key 中指定下标区间内的元素,下标从0开始,到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。
返回值:获取到的元素列表。

2.8.4 lpop

语法:lpop key
功能:移除并返回列表key头部第一个元素,即列表左侧的第一个元素。
返回值:列表左侧第一个元素的值;列表key不存在,返回nil。

2.8.5 rpop

语法:rpop key
功能:移除并返回列表key尾部第一个元素,即列表右侧的第一个元素。
返回值:列表右侧第一个元素的值;列表key不存在,返回nil。

2.8.6 lindex

语法:lindex key index
功能:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。0 表示列表的第一个元素,1 表示列表的第二个元素;index也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
返回值:key存在时,返回指定元素的值;
Key不存在时,返回nil。

2.8.7 llen

语法:llen key
功能:获取列表 key 的长度
返回值:数值,列表的长度;key不存在返回0

2.8.8 lrem

语法:lrem key count value
功能:根据参数 count 的值,移除列表中与参数 value 相等的元素,
count >0 ,从列表的左侧向右开始移除;
count < 0 从列表的尾部开始移除;
count = 0移除表中所有与 value 相等的值。
返回值:数值,移除的元素个数

2.8.9 ltrim

语法:ltrim key startIndex endIndex
功能:截取key的指定下标区间的元素,并且赋值给key。下标从0开始,一直到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。
返回值:执行成功返回ok

2.8.10 lset

语法:lset key index value
功能:将列表 key 下标为 index 的元素的值设置为 value。
功能:设置成功返回ok ; key不存在或者index超出范围返回错误信息。

2.8.11 linsert

语法:linsert key before/after pivot value
功能:将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key不存在或者pivot不在列表中,不执行任何操作。
返回值:命令执行成功,返回新列表的长度。没有找到pivot返回 -1, key不存在返回0。

2.9 集合类型(set)

Redis的Set是string类型的无序不重复集合。
集合类型的数据操作总的思想是通过key确定集合,key是集合标识,元素没有下标,只有直接操作业务数据和数据的个数。

2.9.1 sadd

语法:sadd key member [member…]
功能:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,不会再加入。
返回值:加入到集合的新元素的个数(不包括被忽略的元素)。

2.9.2 smembers

语法:smembers key
功能:获取集合 key 中的所有成员元素,不存在的key视为空集合。
返回值:返回指定集合的所有元素集合,不存在的key,返回空集合。

2.9.3 sismember

语法:sismember key member
功能:判断 member 元素是否是集合 key 的元素
返回值:member是集合成员返回1,其他返回 0 。

2.9.4 scard

语法:scard key
功能:获取集合里面的元素个数
返回值:数字,key的元素个数。其他情况返回 0 。

2.9.5 srem

语法:srem key member [member…]
功能:移除集合中一个或多个元素,不存在的元素被忽略。
返回值:数字,成功移除的元素个数,不包括被忽略的元素。

2.9.6 srandmember

语法:srandmember key[count]
功能:只提供key,随机返回集合中一个元素,元素不删除,依然在集合中;
提供了count时,count 正数, 返回包含count个数元素的集合,集合元素各不重复。count是负数,返回一个count绝对值的长度的集合,集合中元素可能会重复多次。
返回值:一个元素或者多个元素的集合

2.9.7 spop

语法:spop key[count]
功能:随机从集合中删除一个或count个元素。
返回值:被删除的元素,key不存在或空集合返回nil。

2.9.8 smove

语法:smove src dest member
功能:将 member 元素从src集合移动到dest集合,member不存在,smove不执行操作,返回0,如果dest存在member,则仅从src中删除member。
返回值:成功返回 1 ,其他返回 0 。

2.9.9 sdiff

语法:sdiff key key [key…]
功能:返回指定集合的差集,以第一个集合为准进行比较,即第一个集合中有但在其它任何集合中都没有的元素组成的集合。
返回值:返回第一个集合中有而后边集合中都没有的元素组成的集合,如果第一个集合中的元素在后边集合中都有则返回空集合。

2.9.10 sinter

语法:sinter key key [key…]
功能:返回指定集合的交集,即指定的所有集合中都有的元素组成的集合。
返回值:交集元素组成的集合,如果没有则返回空集合。

2.9.11 sunion

语法:sunion key key [key…]
功能:返回指定集合的并集,即指定的所有集合元素组成的大集合,如果元素有重复,则保留一个。
返回值:返回所有集合元素组成的大集合,如果所有key都不存在,返回空集合。

2.10 哈希类型(hash)

Redis的hash 是一个string类型的key和value的映射表,这里的value是一系列的键值对,hash特别适合用于存储对象。
哈希类型的数据操作总的思想是通过key和field操作value,key是数据标识,field是域,value是我们感
兴趣的业务数据。

2.10.1 hset

语法:hset key field value [field value …]
功能:将键值对field-value设置到哈希列表key中,如果key不存在,则新建哈希列表,然后执行赋值,如果key下的field已经存在,则value值覆盖。
返回值:返回设置成功的键值对个数。

2.10.2 hget

语法:hget key field
功能:获取哈希表 key 中给定域 field 的值。
返回值:field域的值,如果key不存在或者field不存在返回nil。

2.10.3 hmset

语法:hmset key field value [field value…]
功能:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的field,hash表key不存在,创建空的hash表,再执行hmset.
返回值:设置成功返回ok,如果失败返回一个错误。

2.10.4 hmget

语法:hmget key field [field…]
功能:获取哈希表 key 中一个或多个给定域的值
返回值:返回和field顺序对应的值,如果field不存在,返回nil。

2.10.5 hgetall

语法:hgetall key
功能:获取哈希表 key 中所有的域和值
返回值:以列表形式返回hash中域和域的值,key不存在,返回空hash.

2.10.6 hdel

语法:hdel key field [field…]
功能:删除哈希表 key 中的一个或多个指定域field,不存在field直接忽略。
返回值:成功删除的field的数量。

2.10.7 hlen

语法:hlen key
功能:获取哈希表 key 中域field的个数
返回值:数值,field的个数。key不存在返回0.

2.10.8 hexists

语法:hexists key field
功能:查看哈希表 key 中,给定域 field 是否存在
返回值:如果field存在,返回1,其他返回0。

2.10.9 hkeys

语法:hkeys key
功能:查看哈希表 key 中的所有field域列表
返回值:包含所有field的列表,key不存在返回空列表

2.10.10 hvals

语法:hvals key
功能:返回哈希表 中所有域的值列表
返回值:包含哈希表所有域值的列表,key不存在返回空列表。

2.10.11 hincrby

语法:hincrby key field int
功能:给哈希表key中的field域增加int
返回值:返回增加之后的field域的值

2.10.12 hincrbyfloat

语法:hincrbyfloat key field float
功能:给哈希表key中的field域增加float
返回值:返回增加之后的field域的值

2.10.13 hsetnx

语法:hsetnx key field value
功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置。
返回值:设值成功返回1,其他返回0.

2.11 有序集合类型(Zset)

Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。

2.11.1 zadd

语法:zadd key score member [score member…]
功能:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果member存在集合中,则覆盖原来的值;score可以是整数或浮点数.
返回值:数字,新添加的元素个数.

2.11.2 zrange

语法:zrange key startIndex endIndex [WITHSCORES]
功能:查询有序集合,指定区间的内的元素。集合成员按score值从小到大来排序;startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,以此类推; startIndex和endIndex都可以取负数,表示从后往前取,-1表示倒数第一个元素;WITHSCORES选项让score和value一同返回。
返回值:指定区间的成员组成的集合。

2.11.3 zrangebyscore

语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
功能:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括min和max)的成员,有序成员是按递增(从小到大)排序;
使用符号”(“ 表示包括min但不包括max;
withscores 显示score和 value;
limit用来限制返回结果的数量和区间,在结果集中从第offset个开始,取count个。
返回值:指定区间的集合数据

2.11.4 zrem

语法:zrem key member [member…]
功能:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略。
返回值:被成功删除的成员数量,不包括被忽略的成员。

2.11.5 zcard

语法:zcard key
作用:获取有序集 key 的元素成员的个数。
返回值:key存在,返回集合元素的个数; key不存在,返回0。

2.11.6 zcount

语法:zcount key min max
功能:返回有序集 key 中, score 值在 min 和 max 之间(包括 score 值等于 min 或 max )的成员的数量。
返回值:指定有序集合中分数在指定区间内的元素数量。

2.11.7 zrank

语法:zrank key member
功能:获取有序集 key 中成员 member 的排名,有序集成员按 score 值从小到大顺序排列,从0开始排名,score最小的是0 。
返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。

2.11.8 zscore

语法:zscore key member
功能:获取有序集合key中元素member的分数。
返回值:返回指定有序集合元素的分数。

2.11.9 zrevrank

语法:zrevrank key member
功能:获取有序集 key 中成员 member 的排名,有序集成员按 score 值从大到小顺序排列,从0开始排名,score最大的是0 。
返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。

2.11.10 zrevrange

语法:zrevrange key startIndex endIndex [WITHSCORES]
功能:查询有序集合,指定区间的内的元素。集合成员按score值从大到小来排序;startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,以此类推; startIndex和endIndex都可以取负数,表示从后往前取,-1表示倒数第一个元素;WITHSCORES选项让score和value一同返回。
返回值:指定区间的成员组成的集合。

2.11.11 zrevrangebyscore

语法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
功能:获取有序集 key 中,所有 score 值介于 max 和 min 之间(包括max和min)的成员,有序成员是按递减(从大到小)排序;
使用符号”(“ 表示不包括min和max;
withscores 显示score和 value;
limit用来限制返回结果的数量和区间,在结果集中从第offset个开始,取count个。
返回值:指定区间的集合数据

3.Redis的配置文件

3.1 redis.conf存放位置

Redis的安装根目录下(/opt/redis-5.0.2),Redis在启动时会加载这个配置文件,在运行时按照配置进行工作。 这个文件有时候我们会拿出来,单独存放在某一个位置,启动的时候必须明确指定使用哪个配置文件,此文件才会生效。

3.2 Redis的网络相关配置

1、bind:绑定IP地址,其它机器可以通过此IP访问Redis,默认绑定127.0.0.1,也可以修改为本机的IP地址。
2、port:配置Redis占用的端口,默认是6379。
3、tcp-keepalive:TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。

3.3 Redis的常规配置

1、loglevel:日志级别,开发阶段可以设置成debug,生产阶段通常设置为notice或者warning.
2、logfile:指定日志文件名,如果不指定,Redis只进行标准输出。要保证日志文件所在的目录必须存在,文件可以不存在。还要在redis启动时指定所使用的配置文件,否则配置不起作用。
3、databases:配置Redis数据库的个数,默认是16个。

3.4 Redis的安全配置

1、requirepass:配置Redis的访问密码。默认不配置密码,即访问不需要密码验证。此配置项需要在protected-mode=yes时起作用。使用密码登录客户端:redis-cli -h ip -p 6379 -a pwd

3.5 Redis的RDB配置

1、save (seconds) (changes):配置复合的快照触发条件,即Redis 在seconds秒内key改变changes次,Redis把快照内的数据保存到磁盘中一次。默认的策略是:
1分钟内改变了1万次
或者5分钟内改变了10次
或者15分钟内改变了1次
如果要禁用Redis的持久化功能,则把所有的save配置都注释掉。

2、stop-writes-on-bgsave-error:当bgsave快照操作出错时停止写数据到磁盘,这样能保证内存数据和磁盘数据的一致性,但如果不在乎这种一致性,要在bgsave快照操作出错时继续写操作,这里需要配置为no。

3、rdbcompression:设置对于存储到磁盘中的快照是否进行压缩,设置为yes时,Redis会采用LZF算法进行压缩;如果不想消耗CPU进行压缩的话,可以设置为no,关闭此功能。

4、rdbchecksum:在存储快照以后,还可以让Redis使用CRC64算法来进行数据校验,但这样会消耗一定的性能,如果系统比较在意性能的提升,可以设置为no,关闭此功能。

5、dbfilename:Redis持久化数据生成的文件名,默认是dump.rdb,也可以自己配置。

6、dir:Redis持久化数据生成文件保存的目录,默认是./即redis的启动目录,也可以自己配置。

3.6 Redis AOF配置

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:设置重写的基准值

4.Redis的持久化

redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失。为了解决这个问题,redis提供了持久化功能——RDB和AOF(Append Only File)。

4.1 RDB

RDB(Redis DataBase)是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis重启会通过加载dump.rdb文件来恢复数据。

4.1.1 RDB原理

Redis会复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程,来进行持久化。

4.1.2 RDB的优缺点

优点:
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效

缺点:
最后一次持久化后的数据可能丢失

4.1.3 RDB保存的文件

RDB保存的文件是dump.rdb文件 ,位置保存在Redis的启动目录。Redis每次同步数据到磁盘都会生成一个dump.rdb文件,新的dump.rdb会覆盖旧的dump.rdb文件。

4.1.4 配置RDB 持久化策略

在redis.conf的快照配置中,配置RDB保存的策略。
在客户端执行FLUSHDB或者FLUSHALL或者SHUTDOWN时,也会把快照中的数据保存到dump.rdb,只不过这种操作已经把数据清空了,保存的也是空文件,没有意义。

4.1.5 手动保存RDB快照

save命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
由于save指令会阻塞所有客户端,所以保存数据库的任务通常由 BGSAVE 命令异步地执行,而save作为保存数据的最后手段来使用,当负责保存数据的后台子进程不幸出现问题时使用。

4.1.6 RDB数据恢复

通过脚本将Redis产生的dump.rdb文件备份(cp dump.rdb dump_bak.rdb),每次启动Redis前,把备份的dump.rdb文件替换到Redis相应的目录(在redis.conf中配的的dir目录)下,Redis启动时会加载dump.rdb文件,并且把数据读到内存中。

4.1.7 RDB小结

Redis默认开启RDB持久化方式,适合大规模的数据恢复但它的数据一致性和完整性较差。

4.2 AOF

AOF(Append Only File),Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

4.2.1 AOF原理

Redis以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

4.2.2 AOF保存的文件

AOF保存的文件是appendonly.aof文件 ,位置保存在Redis的启动目录。如果开启了AOF,Redis每次记录写操作都会往appendonly.aof文件追加新的日志内容。

4.2.3 配置AOF持久化策略

在redis.conf的“APPEND ONLY MODE”配置模块中,配置AOF保存策略。

4.2.4 AOF数据恢复

通过脚本将Redis产生的appendonly.aof文件备份(cp appendonly.aof appendonly_bak.aof),每次启动Redis前,把备份的appendonly.aof文件替换到Redis相应的目录(在redis.conf中配的的dir目录)下,只要开启AOF的功能,Redis每次启动,会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
但在实际开发中,可能因为某些原因导致appendonly.aof 文件格式异常,从而导致数据还原失败,可以通过命令redis-check-aof --fix appendonly.aof 进行修复 。会把出现异常的部分往后所有写操作日志去掉。

4.2.5 AOF的重写

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。当然,也可以在配置文件中进行配置。

4.2.6 AOF小结:

Redis 需要手动开启AOF持久化方式,AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。

关于Redis持久化的使用:若只打算用Redis 做缓存,可以关闭持久化。若打算使用Redis 的持久化,建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。

AOF与RDB模式可以同时启用,这并不冲突。如果AOF是可用的,那Redis启动时将自动加载AOF,这个文件能够提供更好的持久性保障。

5 Redis的事务

5.1Redis的事务

Redis的事务允许在一次单独的步骤中执行一组命令,并且能够保证将一个事务中的所有命令序列化,然后按顺序执行;在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。即Redis的事务要能够保证序列化和原子性。

5.2Redis事务的常用命令:

5.2.1 multi

语法:multi
功能:用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后才能使用EXEC命令原子化地执行这个命令序列。
返回值:开启成功返回OK

5.2.2 exec

语法:exec
功能:在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。
如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行,执行结果报错;
如果在压队列的过程中正常,在执行队列中某一个命令报错,则只会影响本条命令的执行结果,其它命令正常运行;
当使用WATCH命令时,只有当受监控的键没有被修改时,EXEC命令才会执行事务中的命令;而一旦执行了exec命令,之前加的所有watch监控全部取消。
返回值:这个命令的返回值是一个数组,其中的每个元素分别是原子化事务中的每个命令的返回值。 当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值。

5.2.3 discard

语法:discard
功能:清除所有先前在一个事务中放入队列的命令,并且结束事务。
如果使用了WATCH命令,那么DISCARD命令就会将当前连接监控的所有键取消监控。
返回值:清除成功,返回OK。

5.2.4 watch

语法:watch key [key …]
功能:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的。如果被监控的key值在本事务外有修改时,则本事务所有指令都不会被执行。Watch命令相当于关系型数据库中的乐观锁。
返回值:监控成功,返回OK。

5.2.5 unwatch

语法:unwatch
功能:清除所有先前为一个事务监控的键。
如果在watch命令之后你调用了EXEC或DISCARD命令,那么就不需要手动调用UNWATCH命令。
返回值:清除成功,返回OK。

5.3Redis事务小结:

1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用watch命令监控某些键。
2、不保证事务的原子性:redis同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis的事务没有回滚。Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。

6.Redis消息的发布与订阅

6.1 Redis发布订阅

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

6.2 Redis发布订阅的常用命令

6.2.1 subscribe

语法:subscribe channel [channel…]
功能:订阅一个或多个频道的信息
返回值:订阅的消息

6.2.2 publish

语法:publish chanel message
功能:将信息发送到指定的频道。
返回值:数字。接收到消息订阅者的数量。

6.2.3 psubscribe

语法:psubscribe pattern [pattern]
功能:订阅一个或多个符合给定模式的频道。模式以 * 作为通配符,例如:news.* 匹配所有以 news. 开头的频道。
返回值:订阅的信息。

7 Jedis操作Redis

相关资源

  • Redis 英文官网:https://redis.io/
  • Redis 中文官网:http://www.redis.cn
  • Redis 命令内参:http://redisdoc.com
  • Redis 在线测试:http://try.redis.io/
  • 手册地址:
    redis英文版命令大全:https://redis.io/commands
    redis中文版命令大全:http://redisdoc.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值