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上并进行解压缩
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. 安装。
make install PREFIX=/usr/local/redis
PREFIX参数指定redis的安装目录。一般软件安装到/usr/local/redis目录下
6. Redis服务端启动
./redis-server
7. 使用redis-cli连接到redis
./redis-cli
[root@ibm001 bin]# ./redis-cli
127.0.0.1:6379>
8. 退出客户端
Quit
Exit
9. 关闭redis服务
./redis-cli shutdown
Reids的相关配置
- 后台启动redis.不要阻塞前端窗口
把redis-5.0.5中的redis.conf 复制到 redis/bin目录中
cp redis.conf /usr/local/redis/bin
编辑redis.conf
Vi redis.conf 把daemonize 改为yes
- 后台启动redis
./redis-server redis.conf
查看后台进程
ps aux |grep redis
- 远程连接redis
./redis-cli -h 192.168.18.201 -p 6379
Could not connect to Redis at 192.168.18.201:6379: Connection refused不能够远程连接redis
修改redis.conf
把bind给注释掉
然后关闭redis服务 ./redis-cli shutdown
重新启动redis服务 ./redis-server redis.conf
远程连接 ./redis-cli -h 192.168.18.201 -p 6379
- 可以给redis设置密码
修改redis配置文件
把该行去掉注释,同时可以指定密码
然后关闭redis服务 ./redis-cli shutdown
重新启动redis服务 ./redis-server redis.conf
远程连接 ./redis-cli -h 192.168.18.201 -p 6379
关闭redis服务
./redis-cli -a 123456 shutdown
利用rdm来远程连接redis
只有15个库,select加下标选择库 如select 1,select 15100004
Redis的数据类型
String类型
Map<String,String>
1.语法 set key value 设置key的值
示例:set name zhangsan
set age 22
set name lisi 如果key存在,将会覆盖原来key的值
2.语法 get key 获取key的值
示例:get name
get age
3.语法 del key 删除指定key的值
示例:del name
del age
4.语法: append key value 在原来的值的基础上添加新值
示例:set name zhangsan
append name lisi
5.语法: strlen key 获取指定key的值的长度
strlen name 12
6.语法: getrange key start end 获取指定key的值,从start位置开始,end位置结束
示列:getrange name 2 7
7.语法: setrange key offset value 从起始位置替换值
示例:setrange name 2 abc
8.语法: setex key second value 设置key的值并指定存活时间
示例: setex name 100 lisi
9.语法:setnx key value 设置key的值并且永久有效
示例:setnx address beijing
10.语法: incr key 对key的值自增1
示列: incr currentPage
11.语法: decr key 对key的值自减1
示列: decr currentPage
12.语法: incrby key number 对key的值递增number
示列: incrby currentPage 10
13.语法: decrby key number 对key的值递减number
示列: decrby currentPage 5
14.语法: mset key1 value1 key2 value2 …. 一次性设置多个key-value键值对
示列: mset name1 zhangsan name2 lisi name3 wangwu
15.语法: mget key1 key2 …. 一次性获取多个key的值
示列: mget name1 name2
16.语法 expire key seconds 设置key的存活时间 seconds秒数
示例 expire address 30
17 语法 ttl key 查看key的存活时间 如果返回-1 表示永久有效
示例 ttl name
18.语法 persist key 设该key永久有效
示列 persist address
Hash数据类型
Map<String,Map<String,String»
1.语法: hset key field value 设置key 的 field字段的值
示列: hset person name lisi
hset person address changsha
hset person birthday 1997-10-10
2.语法: hget key field 获取key的field字段的值
示例: hget person name
4.语法: hmset key field1 value1 field2 value2 …. 一次设置key的多个字段的值
示例: hmset student name wagnwu age 22 gender man
5.语法: hmget key field1 field2 …. 一次获取key的多个字段的值
示例: hmget student name age gender
6.语法: hgetall key 获取key的多个字段的值(包括键和值)
示例: hgetall student
7.语法: hkeys key 获取key的所有字段
示例: hkeys student
8.语法: hvals key 获取key的所有字段的值
示例: hvals student
9.语法: hdel key field1 field2 … 删除key的所有多个字段的值
示例: hvals student
10.语法: hlen key 返回key的所有键值对的个数
示例: hlen student
11.语法: hexists key field 返回key的field字段是否存在
示例: hexists student name
List数据类型
1.语法: lpush key value1 value2…. 向key集合的左边一次添加值
示例: lpush ages 22 34 21 45 20
2.语法: rpush key value1 value2…. 向key集合的右边一次添加值
示例: rpush names zhangsan lisi wangwu zhaooiu
3.语法: lrange key start stop 取key集合中指定的start位置到stop位置的内容(-1代表集合结束)
示列:lrange ages 0 2
lrange ages 0 -1
lrange ages 0 100
4.语法: llen key 查看key集合的长度
示例: llen ages
5.语法: lpop key 删除key集合的第一个元素
示例: lpop ages
6.语法: rpop key 删除key集合的最后一个元素
示例: rpop ages
7.语法: lindex key index 获取key集合的index索引的元素
示例: lindex ages 2
8.语法: lrem key count value 删除key集合的count个索引的元素(集合中有重复值)
示例: lrem ages 2 45
set数据类型
1.语法: sadd key value1 value2 … 向为key的集合中添加多个值(去重)
示例: sadd empNames zhangsan lisi wangwu zhaoliu lisi
2.语法: smembers key 循环key集合中的所有值
示例: smembers empNames
3.语法: scard key 统计key集合中的元素个数
示例: scard empNames
4.语法: srem key value 删除key集合中的value值
示例: scard empNames lisi
5.语法: spop key 随机删除key集合中的某个值
示例: spop empNames
6.语法: smove source destination member 将集合中的某个值赋给另外一个集合: SMOVE 源集合 目的集合 值
示例: smove empNames works zhangsan
7.语法: Sdiff 集合1 集合2 求差集
示例: sadd seta a b c d e
sadd setb c d e f g
sdiff seta setb
-
“a”
-
“b”
sdiff setb seta
-
“f”
-
“g”
8.语法: sinter 集合1 集合2 求交集
示例: sinter seta setb
-
“d”
-
“c”
-
“e”
9.语法: sunion 集合1 集合2 求并集
示例: sunion seta setb
-
“d”
-
“a”
-
“b”
-
“c”
-
“e”
-
“f”
-
“g”
zset(SortedSet)数据类型
1.语法: zadd key score value … 向为key的集合中添加多个(score-value)
示例: zadd students 1 zhangsan 3 lisi 2 wangwu 5 zhaoliu
2.语法: zrange key start stop [WITHSCORES] 循环key的集合从start位到stop位置的值
示例: zrange students 0 -1
-
“zhangsan”
-
“wangwu”
-
“lisi”
-
“zhaoliu”
3.语法: zrem key value 删除key集合中指定的value元素
示例: zrem students lisi
4.语法: zrevrange key start stop [WITHSCORES] 逆序显示key集合中的元素
示例: zrevrange students 0 -1
zrevrange students 0 -1 withscores
5.语法: zrangebyscore key min max 根据分数区间查询内容
示例:zrangebyscore students 2 5
6.语法: zcard key 统计key集合中有多少个键值对
示例: zcard students
7.语法: zcount key min max 统计key集合中min到max区间元素
示例: zcount students 1 4
8.语法: zrank students wangwu 统计key集合中指定元素索引
示例: zrank students wangwu
9.语法: zscore key value 统计key集合中指定元素的分数
示例: zscore students zhangsan
关于redis的持久化方案
Redis中所有的key和value默认加载到内存中,为了数据的不丢失,把数据进行持久化,通常会把数据落地磁盘。
第一种持久化方案(默认rdb)
In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
对于数据不敏感,可以用这种方式,可以会丢数据,但效率高。(减少I/o操作)。
第二种持久化方案 aof
修改redis.conf
对数据特别敏感,保证不能丢数据。效率低(增加I/o操作)
利用Jedis API来操作redis
- 导入依赖
<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>
- 把相关的类交给spring容器管理
<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.18.201" />
<constructor-arg name="port" value="6379" />
<constructor-arg name="timeout" value="30000" />
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JedisTest {
@Autowired
private JedisPool jedisPool;
@Test
public void testAdd(){
Jedis jedis = jedisPool.getResource();
jedis.set("name","wangwu");
jedis.close();
}
@Test
public void testAddPerson(){
Person person=new Person(100,"张三","男",22,new Date());
Jedis jedis = jedisPool.getResource();
// jedis.set("person", JsonUtils.objectToJson(person));
jedis.hset("persons",person.getName(),JsonUtils.objectToJson(person));
jedis.close();
}
@Test
public void testAddPerson2(){
Jedis jedis = jedisPool.getResource();
String jsonData=jedis.get("person");
Person person=JsonUtils.jsonToEntity(jsonData,Person.class);
System.out.println(person);
jedis.close();
}
}