什么是redis中间件?
什么是redis?redis的介绍。redis的安装以及其数据类型的详解redis的两种持久化方案详解在IDEA中如何用API来操作redis
redis介绍
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis的官网地址,非常好记,是redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。
redis安装
1、下载redis
2、上传到linux上并进行解压缩(usr/local目录下)
tar zxf redis-5.0.5.tar.gz
3、按装redis运行环境
Redis是c语言开发的安装redis需要c语言的编译环境。如果没有gcc需要在线安装。
yum install gcc-c++
yum -y install gcc automake autoconf libtool make
yum -y install tcl
4、编译。进入redis目录。
make
5、安装 PREFIX参数指定redis的安装目录。一般软件安装到/usr/local/redis目录下
make install PREFIX=/usr/local/redis
redis服务启动
- 在redis/bin目录下 ./redis-server 【会阻断前端窗口】
- 在另一个连接的redis/bin目录下 执行./redis-cli
- 127.0.0.1:6379> quit/exit 退出
redis服务关闭
-
在redis/bin目录下 执行./redis-cli shutdown
-
直接暴力关闭 ctrl+C
使redis服务后台启动
- 先把redis-5.0.5【redis解压缩的包】中的redis.conf 复制到 redis/bin目录中
cp redis.conf /usr/local/redis/bin
- 编辑redis.conf 把daemonize 改为yes【守护线程打开】
daemonize yes
- 按照配置的方式启动【不会阻塞前端窗口】
./redis-server redis.conf
ps aux | grep redis进程 // 查看 redis进程
设置远程连接redis
- 编辑redis.conf 把bind给注释掉【默认绑定到本机】
#bind 127.0.0.1
- 在redis.conf 中默认受保护模式关闭【为了远程可以操作数据】【不推荐使用。因为受保护模式关闭后任何人都可以修改数据】
protected-mode no
- 远程连接
./redis-server redis.conf //开启redis服务
./redis-cli -h 192.168.146.132 -p 6379 // 远程连接
- 通过密码来修改数据【推荐使用】。编辑redis.conf 。打开后保护模式,
requirepass 123456 // 设置密码
- 远程连接【auth 认证密码】
./redis-server redis.conf //开启redis服务
./redis-cli -h 192.168.146.132 -p 6379 // 远程连接
192.168.146.132:6379> auth 123456 // 认证密码
OK
./redis-cli -a 123456 shutdown // 通过密码的方式关闭redis服务
Redis的数据类型
String类型
【Map<String,String>】
语法 set key value //设置key的值
示例:set name zhangsan
set age 22
set name lisi //如果key存在,将会覆盖原来key的值
语法 get key //获取key的值
示例:get name
get age
语法 del key //删除指定key的值
示例:del name
del age
语法: append key value //在原来的值的基础上添加新值
示例:set name zhangsan
append name lisi
语法: strlen key //获取指定key的值的长度
strlen name 12
语法: getrange key start end
// 获取指定key的值,从start位置开始,end位置结束
示列:getrange name 2 7
语法: setrange key offset value
//从起始位置替换值 【按照替换内容位数依次替换】
示例:setrange name 2 abc
语法: setex key second value //设置key的值并指定存活时间 【秒】
示例: setex name 100 lisi
示例:ttl name
//【显示存活时间 返回值为-2表示失效 返回值为-1表示永久有效】
语法: expire key second//先设置键值对,在设置过期时间
示例:set gender man
示例:expire gender 20 【20秒后过期 】
语法:setnx key value // 设置key的值并且永久有效
示例:setnx address beijing
语法: incr key //对key的值自增1
示列: incr currentPage
语法: decr key //对key的值自减1
示列: decr currentPage
语法: incrby key number //对key的值递增number
示列: incrby currentPage 10
语法: decrby key number // 对key的值递减number
示列: decrby currentPage 5
语法: mset key1 value1 key2 value2 ....
//一次性设置多个key-value键值对
示列: mset name1 zhangsan name2 lisi name3 wangwu
语法: mget key1 key2 .... // 一次性获取多个key的值
示列: mget name1 name2
语法 persist key // 设该key永久有效
示列 persist address
语法 ttl key //查看key的存活时间 如果返回-1 表示永久有效
示例 ttl name
Hash数据类型
【Map<String,Map<String,String>>】
语法: hset key field value //设置key 的 field字段的值
示列: hset person name lisi
hset person address changsha
hset person birthday 1997-10-10
语法: hget key field //获取key的field字段的值
示例: hget person name
//一次设置key的多个字段的值
语法: hmset key field1 value1 field2 value2 ....
示例: hmset student name wagnwu age 22 gender man
//一次获取key的多个字段的值
语法: hmget key field1 field2 ....
示例: hmget student name age gender
语法: hgetall key //获取key的多个字段的值(包括键和值)
示例: hgetall student
语法: hkeys key //获取key的所有字段
示例: hkeys student
语法: hvals key // 获取key的所有字段的值
示例: hvals student
//删除key的所有多个字段的值
语法: hdel key field1 field2 ...
示例: hvals student
语法: hlen key // 返回key的所有键值对的个数
示例: hlen student
//返回key的field字段是否存在【0表示不存在,1表示存在】
语法: hexists key field
示例: hexists student name
List数据类型
语法: lpush key value1 value2.... // 向key集合的左边一次添加值
示例: lpush ages 22 34 21 45 20
语法: rpush key value1 value2.... // 向key集合的右边一次添加值
示例: rpush names zhangsan lisi wangwu zhaooiu
语法: lrange key start stop
//取key集合中指定的start位置到stop位置的内容(-1代表集合结束)
示列:lrange ages 0 2
lrange ages 0 -1
lrange ages 0 100
语法: llen key //查看key集合的长度
示例: llen ages
语法: lpop key //删除key集合的第一个元素
示例: lpop ages
语法: rpop key //删除key集合的最后一个元素
示例: rpop ages
语法: lindex key index //获取key集合的index索引的元素
示例: lindex ages 2
//删除key集合的count个索引的元素(集合中有重复值)
语法: lrem key count value
示例: lrem ages 2 45
Set数据类型
// 向为key的集合中添加多个值(去重)
语法: sadd key value1 value2 ...
示例:
192.168.146.132:6379> sadd ages 20 20 21 22 23 24
(integer) 5
// 循环key集合中的所有值
语法: smembers key
示例:
192.168.146.132:6379> smembers ages
1) "20"
2) "21"
3) "22"
4) "23"
5) "24"
// 统计key集合中的元素个数
语法: scard key
示例:
192.168.146.132:6379> scard ages
(integer) 5
// 删除key集合中的value值
语法: srem key value
示例:
192.168.146.132:6379> srem ages 20
(integer) 1
// 随机删除key集合中的某个值
语法: spop key
示例:
192.168.146.132:6379> srem ages 20
(integer) 1
// 将集合中的某个值赋给另外一个集合: SMOVE 源集合 目的集合 值
语法: smove source destination member
示例:
192.168.146.132:6379> smove names student zhangsan
(integer) 1
- 求差集 差集 并集
// 创建两个set集合
192.168.146.132:6379> sadd a1 a b c d e f
(integer) 6
192.168.146.132:6379> sadd a2 c d e f g h
(integer) 6
// 求差集
语法: Sdiff 集合1 集合2
示例:
192.168.146.132:6379> sdiff a1 a2
1) "a"
2) "b"
192.168.146.132:6379> sdiff a2 a1
1) "g"
2) "h"
// 求交集
语法: sinter 集合1 集合2
示例:
192.168.146.132:6379> sinter a1 a2
1) "c"
2) "d"
3) "e"
4) "f"
// 求并集
语法: sunion 集合1 集合2
示例:
192.168.146.132:6379> sinter a1 a2
192.168.146.132:6379> sunion a1 a2
1) "a"
2) "c"
3) "d"
4) "e"
5) "f"
6) "g"
7) "h"
8) "b"
zset(SortedSet)数据类型
// 向为key的集合中添加多个(score-value)
语法: zadd key score value ...
示例:
192.168.146.132:6379> zadd students 90 zhangsan 50 lisi 60 wangwu 40 zhaoliu 80 zhouqi
(integer) 5
// 循环key的集合从start位到stop位置的值
语法:zrange key start stop [WITHSCORES]
zrange key start stop withscores
示例:
192.168.146.132:6379> zrange students 0 -1
1) "zhaoliu"
2) "lisi"
3) "wangwu"
4) "zhouqi"
5) "zhangsan"
192.168.146.132:6379> zrange students 0 -1 withscores
1) "zhaoliu"
2) "40"
3) "lisi"
4) "50"
5) "wangwu"
6) "60"
7) "zhouqi"
8) "80"
9) "zhangsan"
10) "90"
// 删除key集合中指定的value元素
语法: zrem key value
示例:
192.168.146.132:6379> zrem students lisi
(integer) 1
// 逆序显示key集合中的元素
语法:zrevrange key start stop [WITHSCORES]
zrevrange key start stop withscores
示例:
192.168.146.132:6379> zrevrange students 0 -1 withscores
1) "zhangsan"
2) "90"
3) "zhouqi"
4) "80"
5) "wangwu"
6) "60"
7) "zhaoliu"
8) "40"
// 根据分数区间查询内容
语法: zrangebyscore key min max
示例:
192.168.146.132:6379> zrangebyscore students 50 65
1) "wangwu"
// 统计key集合中有多少个键值对
语法: zcard key
示例:
192.168.146.132:6379> zcard students
(integer) 4
// 统计key集合中min到max区间元素
语法: zcount key min max
示例:
192.168.146.132:6379> zcount students 40 65
(integer) 2
// 统计key集合中指定元素索引
语法: zrank students wangwu
示例:
192.168.146.132:6379> zrank students zhangsan
(integer) 3
// 统计key集合中指定元素的分数
语法: zscore key value
示例:
192.168.146.132:6379> zscore students zhangsan
"90"
redis的持久化方案
第一种持久化方案(默认rdb)
Redis中所有的key和value默认加载到内存中,为了数据的不丢失,把数据进行持久化,通常会把数据落地磁盘。
特点:对于数据不敏感,可以用这种方式,可以会丢数据,但效率高。(减少I/o操作)。
默认方案
第二种持久化方案 aof
修改redis.conf配置中 appendonly 改为yes
特点:对数据特别敏感,保证不能丢数据。效率低(增加I/o操作)
在idea中利用Jedis API来操作redis
在pom文件中导入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- 返回json字符串的支持 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
在resources中创建applicationContext.xml,配置。把相关的类交给spring容器管理
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--jedis池参数配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="3" />
<!-- 最大连接数 -->
<property name="maxTotal" value="5" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="true" />
<!-- 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 -->
<property name="maxWaitMillis" value="30000" />
<!-- 在获取连接的时候检查有效性 -->
<property name="testOnBorrow" value="true" />
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
<constructor-arg name="host" value="192.168.146.132" />
<constructor-arg name="port" value="6379" />
<constructor-arg name="timeout" value="30000" />
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
</beans>
创建测试类测试:
package com;
import com.chenshuang.entity.Person;
import com.chenshuang.utils.JsonUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class test {
@Resource
private JedisPool jedisPool;
// 把Sting数据到redis中
@Test
public void testString(){
Jedis jedis = jedisPool.getResource();
jedis.set("sushe","301");
jedis.close(); // 关闭连接
}
@Test
// 把HashMap类型的数据存入redis中
public void testHashMap(){
Jedis jedis = jedisPool.getResource();
jedis.hset("animals","tiger","大王");
jedis.hset("animals","dog","阿福");
jedis.hset("animals","cat","咪咪");
jedis.close(); // 关闭连接
}
@Test
// 把对象转成json格式后,存到redis中
public void objectToEntity(){
Jedis jedis = jedisPool.getResource();
Person person = new Person(1, "张三", "男", 23);
String s = JsonUtils.objectToJson(person);
jedis.set("1",s);
jedis.close(); // 关闭连接
}
@Test
// 把redis中的json格式取到程序中输出
public void entityToObject(){
Jedis jedis = jedisPool.getResource();
String s = jedis.get("1");
Person person = JsonUtils.jsonToEntity(s, Person.class);
System.out.println(person);
jedis.close(); // 关闭连接
}
}
更多推荐
所有评论(0)