Redis简介
关系型数据库 mssql mysql oracle sybase
非关系型数据库(大数据)redis mongodb
Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库。
Redis还是一个开源的、基于Key-Value 键值对 方式的存储数据系统。可以理解为key是列名,value是存入的值
它支持丰富的数据类型(结构),比如:String(字符串)、Hash(哈希)、List(列表)、Sets(集合)和Sorted Sets(有序集合)等类型。
可持久化(随时把数据备份到硬盘中),保证数据安全。
Redis也通常被称为数据结构服务器。
中文官网:http://www.redis.cn
数据缓存:
在Web开发的时候,如果有一些数据在短时间内不会发生变化,而它们还要被频繁的访问,为了提高用户的请求速度和降低网站的负载,就把这些数据放到一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据),该行为就称作对该数据的缓存。
该介质可以是文件、数据库、内存。
内存介质经常用于数据缓存。
Redis缓存案例:
同一个select查询SQL语句,每天需要被执行查询100万次,并且每次查询获得的数据还是一样的。为了减轻数据库的负载,就把查询好的数据给缓存起来(存储在内存中),第一个用户执行Select查询时从数据库中获得数据并存储到内存中,第二个到第100万个用户查询就直接从内存中获得数据。
使用缓存减轻数据库的负载。数据库是整个网站资源的“瓶颈”。
缓存的两种形式:
(1)网页缓存经常用在CMS(Content Manage System)内容管理系统中(Smarty缓存)
不发生变化的新闻信息页面适合做“页面缓存”,每个用户就从一个静态页面访问该新闻即可。
(2)数据缓存经常会用在页面的具体数据中使用
京东网站的一个页面从业务上看,数据有分类(推广商品、商品精选、普通商品),这些商品从数据读取出来,为了降低数据库负载,可以给它们设置三个数据缓存,这样独立更新、独立读取。
Redis数据的基本操作(在客户端操作)
Redis存放的5种数据类型:
类型 | 说明 |
String | 字符串 |
Hash | 哈希 |
List | 列表 |
Set | 集合 |
Sorted Set | 有序集合 |
命令方式操作5种数据类型:
命令 | 说明 | 案例 |
KEYS * | 查看所有键 |
|
String 字符串
一般用于存储字符串数据。
命令 | 说明 | 案例 |
SET key value | 设置指定 key 的值 | SET uname "admin" SET upwd "123" |
GET key | 获取指定 key 的值 | GET uname |
GETRANGE key start end | 返回 key 中字符串值的子字符(截取) | GETRANGE uname 0 2 |
TYPE key | 显示Key的类型 | TYPE uname |
Hash 哈希
一般用于存储对象。
命令 | 说明 | 案例 |
HMSET key field1 value1 field2 value2…… | 添加对象(key为对象名,field字段,value字段值) | HMSET user uname "admin" password "123" age 18 |
TYPE key | 查看key(对象)类型 | TYPE user |
HGET key field | 获取 key 中指定字段的值 | HGET user uname |
HGETALL key | 获取指定 key 的所有字段和值 | HGETALL user |
HEXISTS key field | 查看 key 中指定的字段是否存在 | HEXISTS user age |
HDEL key field1 [field2] | 删除一个或多个哈希表字段 | HDEL user uname age |
HLEN key | 获取 key 中字段的数量 | HLEN user |
List 链表
一般是简单的字符串列表,按照插入顺序排序。
链表是一种数据结构,我们学习过的LinkedList也是链表结构的一种。
链表分为很多种:单向链表、双向链表、循环链表、块状链表等等。
命令 | 说明 | 案例 |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部(左侧) | LPUSH zking "admin" LPUSH zking "abc" "abb" "abc" |
RPUSH key value1 [value2] | 将一个或多个值插入到列表尾部(右侧) | RPUSH zking "admin" RPUSH zking "abc" "abb" "abc" |
LPUSHX key value | 将一个值插入到已存在列表的头部(左侧) | LPUSHX zking “left” |
RPUSHX key value | 将一个值插入到已存在列表的尾部(右侧) | RPUSHX zking “right” |
LLEN key | 获取列表长度 | LLEN zking |
LRANGE key start end | 获取列表指定范围内的元素 | LRANGE zking 0 2 |
LPOP key | 移出并获取列表的第一个元素 | LPOP zking |
RPOP key | 移除并获取列表最后一个元素 | RPOP zking |
Set 集合
集合是唯一字符串的无序集合。
唯一值表示集合中不允许键中有重复的数据。
命令 | 说明 | 案例 |
SADD key value1 [value2...] | 向集合添加一个或多个成员。 重复数据不能插入 | SADD course “java” SADD course “sqlserver” “sql” |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 | SSCAN couse 0 match s* |
SCARD key | 获取集合的成员数 | SCARD course |
SREM key value1 [value2...] | 向集合删除一个或多个成员 | SREM course “java” |
SISMEMBER key value | 判断 member 元素是否存在,是返回1,不是返回0 | SISMEMBER course “java” |
SMEMBERS key | 返回集合中的所有成员 | SMEMBERS course |
SDIFF key [key1, key2 ...] | 差集运算 属于key且不属于key1的元素构成的集合 | SADD setA 1 2 3 SADD setB 2 3 4 SADD setC 1 2 5 SDIFF setA setB SDIFF setA setB setC |
SINTER key [key ...] | 交集运算 | SINTER setA setB SINTER setA setB setC |
SUNION key [key ...] | 并集运算 | SUNION setA setB SUNION setA setB setC |
Sorted Set 有序集合
实际上就是在集合类型上加了个有序而已。
有序集合比列表费内存。
命令 | 说明 | 案例 |
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数。 如果member存在,则score会覆盖原有的分数。 | ZADD person 1 Tom ZADD person 1 One 2 Two 3 Three |
ZCARD key | 获取有序集合的成员数 | ZCARD person |
ZCOUNT key min max | 获得指定分数范围的元素个数 | ZCARD person 1 3 |
使用Java代码实现Redis的CURD
修改redis.conf
……
#bind 127.0.0.1
……
protected-mode no
……
#bind 127.0.0.1注释掉该IP地址,表示允许网络访问。
注意:Redis默认只允许本机连接,网络访问不允许。因此注释掉该段代码,允许网络访问。
protected-mode no表示运行时报受保护异常。
重启redis:
$ ./redis-cli shutdown #关闭
$ ./redis-server reids.conf #重启启动
启动Linux中的redis
$ ./redis-server redis.conf
$ ./redis-cli
用Maven搭建项目
在pom.xml中引入Jedis依赖包
<!--引入redis依赖-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>