目录
3)expire key seconds 设置key的生存时间
4、Redis操作字符串类型(string)值value的命令
3)hmset key field value [field value…]
8、Redis操作有序集合类型 zset (sorted set) 值vaue的命令
1)zadd key score member [score member…]
2)zrange key start stop [WITHSCORES]
什么是Redis?
1、数据库分为两个类型:
关系型数据库。如MySQL、Oracle等。
非关系型数据库NoSQL。如redis等。
在非关系型数据库NoSQL数据库中数据之间是无联系的,无关系的。数据的结构是松散的,可变的。
2、Remote Dictionary Server(Redis)是一个开源的使用 C语言编写、支持网络、可基于内存亦可持久化的Key-Value数据库。 Key字符类型,其值(value)可以是字符串(String), 哈希(Map),列表(list), 集合(sets) 和有序集合(sorted sets)等类型,每种数据类型有自己的专属命令。所以它通常也被称为数据结构服务器。通过key找到对应存储的值value。
3、和memcached一样,为了保证效率,数据都是缓存在内存中的,所以Redis常常被用作缓存用,用户访问的数据如果在redis缓存中有就直接返回,redis没有才从数据库中查出,减少数据库的io操作。
为什么要有Redis?
互联网应用的特点(QQ微信等):
- 访问量大
- 数据量多
- 高并发
- 高可用
随着互联网应用的崛起,原本的关系型MySQL数据库难以面对互联网应用的这些特点,所以诞生了非关系型数据库Redis。
关系型数据库(MySQL)的瓶颈:
- 1)无法应对每秒上万次的读写请求,无法处理大量集中的高并发操作。关系型数据的IO密集的应用。硬盘IO也变为性能瓶颈
- 2)无法简单地通过增加硬件、服务节点来提高系统性能。数据整个存储在一个数据库中的。多个服务器没有很好的解决办法,来复制这些数据。
- 3)关系型数据库大多是收费的,对硬件的要求较高。软件和硬件的成本花费比重较大。
- 4)关系型数据库的列数是有限制的,好像最多只能有一千多。而且行数越多的,查询速度也就越慢,所以无法面对海量数据,速度太慢了。
Redis的优势:
1、大数据量,高性能
NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。关系型数据库(例如MySQL)使用查询缓存。这种查询缓存在更新数据后,缓存就是失效了。在频繁的数据读写交互应用中。缓存的性能不高。NoSQL的缓存性能要高的多
2、灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。尤其在快速变化的市场环境中,用户的需求总是在不断变化的。
3、高可用
一台服务器出故障了,会有另一台服务器顶上。
4、低成本
这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本。
Redis的劣势:
(1) 不支持标准的SQL,没有公认的NoSQL标准
(2) 没有关系型数据库的约束,大多数也没有索引的概念
(3) 没有事务,不能依靠事务实现ACID。
(4) 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)
ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
怎么用Redis?
1、Redis安装卸载以及连接
Window上安装Redis
Windows版本的Redis是Microsoft的开源部门提供的Redis。而不是原Redis作者开发的那个,原Redis只能运行在Linux系统上。
windows版本的Redis适合开发人员学习使用,就可以不用启动虚拟机占用资源了,生产环境中使用Linux系统上的Redis。
第一步:先下载Redis安装包
windows版本:Redies安装包
.msi 为安装版本,安装过程中自动配置,一路next,环境变量等自动配置。
.zip 为压缩版本,安装过程中手动配置,需要自己配置环境变量等。
第二步:安装
下载的Redis-x64-xxx.zip 解压后,放到某个目录(例如d:\tools\),即可使用,类似tomcat。
第三步:启动Redis
双击D:\develop\Redis-x64-xxx中的redis-server.exe
看到这个说明安装成功。
第四步:关闭Redis
按ctrl+c 退出Redis服务程序。
Redis的客户端
Redis客户端是一个程序,通过网络连接到Redis服务器,在客户端软件中使用Redis可以识别的命令,向Redis服务器发送命令,告诉Redis想要做什么。Redis把处理结果显示在客户端界面上。通过Redis客户端和Redis服务器交互。
就像navicat就是一个客户端程序软件,可以连接mysql、oracle等数据库,进行交互。
redis远程客户端 Redis Desktop Manager
链接:https://pan.baidu.com/s/13NRpOpTkUIiQJRI9aXJ_Iw
提取码:27vq
下载完Redis的客户端,我们现在要进行连接了。
但是有一个注意的是:Redis安装完默认只有安装了Redis的服务器本机才可以连接访问,其他网络中的服务器不能访问,想要访问的话,就得通过redis.conf文件修改Redis的安全策略以及绑定的ip,还要关闭Redis所在服务器的防火墙。
redis.conf:
改完redis.conf的配置文件后,以后每次启动redis服务都要指定上这个配置文件的路径,让redis启动的时候使用配置文件的配置信息,启动redis的命令:
/redishome/redis-server.exe */redis.conf &(配置文件的路径)
连接redis:
默认有16个数据库
在Windows上卸载Redis
执行以下两个命令,然后删除和Redis有关的所有文件。
Linux上安装Redis
2、Redis基本操作命令
redis默认为16个库 (在redis.conf文件可配置,该文件很重要,后续很多操作都是这个配置文件) redis默认自动使用0号库
1) 沟通命令,查看状态
redis >ping 返回PONG
解释:双击redis-cli.exe使用redis自带的输入ping,redis给我们返回PONG,表示redis服务运行正常。
2) 查看当前数据库中key的数目:dbsize
语法:dbsize
作用:返回当前数据库的 key 的数量。
3) redis默认使用16个库
Redis默认使用16个库,从0到15。 对数据库个数的修改,在redis.conf文件中databases 16
4) 切换库命令:select dbIndex
5) 删除当前库的数据:flushdb
3、Redis操作key的命令
1)keys 查找key
语法:keys pattern
作用:查找所有符合模式pattern的key. pattern可以使用通配符。
通配符:
*:表示0-多个字符,例如:keys * 查询所有的key。
?:表示单个字符,例如:wo?d , 匹配 word , wood
例1:显示所有的key
例2:使用 *表示0或多个字符
例3:使用?表示单个字符
2)exists key 判断key是否存在
语法:exists key [key…]
作用:判断key是否存在
返回值:整数,存在key返回1,其他返回0.使用多个key,返回存在的key的数量。
例1:检查指定key是否存在
例2:检查多个key存在几个
3)expire key seconds 设置key的生存时间
语法:expire key seconds
作用:设置key的生存时间,超过时间,key自动删除。单位是秒。
返回值:设置成功返回数字 1,其他情况是 0 。
例1:设置红灯的倒计时是10秒
4)ttl key 返回key的剩余生存时间
语法:ttl key
作用:以秒为单位,返回key的剩余生存时间(ttl: time to live)
返回值情况:
-1 :没有设置key的生存时间, key永不过期。
-2:key不存在
数字:key的剩余时间,秒为单位
5)type key 查看key所存储的值的数据类型
语法:type key
作用:查看key所存储值的数据类型
返回值:字符串表示的数据类型
⚫ none (key不存在)
⚫ string (字符串)
⚫ list (列表)
⚫ set (集合)
⚫ zset (有序集)
⚫ hash (哈希表)
例1:查看存储字符串的key:good
6)del key删除key
语法:del key [key…]
作用:删除存在的key,不存在的key忽略。
返回值:数字,删除的key的数量。
例1:删除指定的key
4、Redis操作字符串类型(string)值value的命令
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数
据,序列化后的数据,JSON格式数据,文本,数值。最大能存储512M。
1)set key value
给key设置值,存储value值
注意:
向已经存在的key设置新的value,会覆盖原来的值
2)get key
获取key对应存储的value
5、Redis操作哈希类型hash值value的命令
前面说了Redis是Key-Value数据库,key是string,value可以是string、hash、list、set等,这里介绍的是hash,每种类型的value都有属于自己的命令。
redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
1)hset key field value
语法:hset key field value
类似Java中的:Map<String,Map<String,value>>
第一次执行以上命令的话,是创建存储值类型为hash的key-value,是创建hash表,并往hash表中添加数据field-value。
返回值:
①如果field是hash表中新field,则添加field-value,返回1
②如果field已经存在,旧值覆盖新值,返回0
key是string:website value是hash
2)hget key(hash表名) field
语法:hget key field
作用:获取哈希表 key 中给定域 field 的值
返回值:field域的值,如果key不存在或者field不存在返回nil
3)hmset key field value [field value…]
语法:hmset key field value [field value…]
说明:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的field,
hash表key不存在,则创建空的hash表。
可以往原有的hash表中同时添加多个值,也可以创建新的hash表同时添加多个值。
返回值:设置成功返回ok,如果失败返回一个错误
4)hmget key field [field…]
语法:hmget key field [field…]
作用:根据key获取对应的hash表中的 中一个或多个给定field域对应的值
返回值:返回和field顺序对应的值,如果field不存在,返回nil
5) hgetall key
根据key获取对应存储的hash表
7)hdel key field [field...]
根据key删除对应的hash中field对应的值。
6、Redis操作列表list值value的命令
key是String类型,value是list类型。
Redis列表是简单的字符串列表,列表中的值是可重复的,按照插入顺序排序,是有序的。类似Java中的list。
1)lpush key value [value...]
往key对应的list中添加一个或多个值,从左边开始加入值,从左到右的顺序依次插入到表头。
返回值:数字,新列表的长度
从左边开始加入值:
可重复的:
2)rpush key value [value...]
往key对应的list中添加一个或多个值,从右边开始加入值,从右到左的顺序依次插入到表头。
返回值:数字,新列表的长度
7、Redis操作集合类型set值value的命令
key是String类型的,value是set类型的。
redis的Set是string类型的无序集合,集合中的数据是唯一的,即集合中不能出现重复的数据
1)sadd key member [member…]
往key存储的set无序集合中添加一个数据member或多个数据member,若添加的数据member已经存在了,则不会被添加进去。
返回值:加入到集合的新元素的个数。不包括被忽略的元素。
2)smembers key
查看key存储的set集合
3)sismember key member
查看member是否是key的对应的set集合中的成员。
返回值:member是集合成员返回1,其他返回 0
4)srem key member [member…]
语法:srem key member [member…]
删除key对应的set中的数据member
返回值:数字,成功删除的元素个数,不包括被忽略的元素。
8、Redis操作有序集合类型 zset (sorted set) 值vaue的命令
key是string类型,value是zset集合。
redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。
不同的是zset集合中的数据都是有序的。
zset的每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员进行从小到大的排序。
数据有序且不重复。
1)zadd key score member [score member…]
命令:zadd key score member [score member…]
往key对应的zset中添加一个或多个数据member,score可以是整数或浮点数,用于zset中的成员进行排序。
按分数排序:
2)zrange key start stop [WITHSCORES]
语法:zrange key start stop [WITHSCORES]
作用:查询key对应的zset有序集合的指定区间的内的元素。集合成员按score值从小到大来排序。start, stop都是从0开始。0是第一个元素,1是第二个元素,依次类推。以 -1表示最后一个成员,-2 表示倒数第二个成员。WITHSCORES选项让score和value一同返回。
返回值:自定区间的成员集合
9、Redis事务
事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
Redis中的事务(transaction)是一组redis命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何其他操作打断。
1) multi
语法: multi
作用:标记一个事务的开始。表示我要开始将命令放到事务队列了。事务内的多条命令会按照先后顺序被放进一个队列当中。
返回值:总是返回ok
2)exec
语法:exec(execute)
作用:执行所有事务队列内的命令
返回值:事务内的所有执行语句内容,事务被打断,返回nil
3)discard
语法:discard
作用:取消事务,放弃执行事务块内的所有命令
返回值:总是返回ok
4)watch key [key ...]
语法:watch key [key ...]
作用:监视一个(或多个) key是否被其他事务所改动 ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
返回值:总是返回ok
5)unwatch
语法:unwatch
作用:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
返回值:总是返回ok
6)事务的正常执行
事务的执行步骤:首先开启事务,其次向事务队列中加入命令,最后执行事务提交。
1)multi:用multi命令告诉Redis,接下来要执行的命令你先不要执行,而是把它们暂时存起来(开启事务)
2)sadd workers john第一条命令进入等待队列(命令入队)
3)sadd workers rose 第二条命令进入等待队列(命令入队)
4)smembers workers 第三条命令进入等待队列(命令入队)
5)...............
6)exce告知redis执行前面发送的命令(提交事务)
7)事务执行exec之前,入队命令错误
事务执行exec之前,入队的命令有错误,Redis会检测到错误,然后自动终止事务的执行,放弃事务。
8)事务队列中有执行错误的命令,不会回滚
在exec执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。
Redis 事务中如果有执行时错误不进行回滚,而是继续执行余下的命令。一方面是为了效率高,回滚的话,需要将旧值保存起来,有错误时回滚到旧值,这样效率就低了。另一方面,Redis认为这些执行时错误应该在开发测试的时候就被发现,不应该出现在生产环境中。Redis的事务只能保证你事务中的命令一定会被执行。
9)放弃事务
执行步骤:
1) MULTI 开启事务
2) SET age 25 命令入队
3) SET age 30 命令入队
4) DISCARD 放弃事务,则事务队列中的命令不会被执行
10)Redis的watch机制
WATCH机制原理:
WATCH机制:使用WATCH监视一个或多个key , 跟踪key的value修改情况,如果有
key的value值在事务EXEC执行之前被修改了,整个事务被取消。EXEC 返回提示信息,表示事务已经失败。
WATCH机制使的事务EXEC变的有条件,事务只有在被WATCH的key没有修改的前提下才能执行。不满足条件,事务被取消。使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行
10、Jedis操作Redis
redis的Java编程客户端,Redis官方首选推荐使用Jedis,jedis是一个很小但很健全的
redis的java客户端。通过Jedis可以像使用Redis命令行一样使用Redis。
1)下载Jedis和Commons-Pool
Jedis是Redis的java客户端。 Maven依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>
Jedis对象并不是线程安全的,在多线程下使用同一个Jedis对象会出现并发问题。为了避免每次使用Jedis对象时都需要重新构建,Jedis提供了JedisPool。JedisPool是基于
Commons Pool 2实现的一个线程安全的连接池。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>