redis

redis是什么

Redis是完全开源免费的,高性能的key-value数据库。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。

为什么使用redis

  1. 性能高。Redis读的速度是110000次/s,写的速度是81000次/s。
  2. 丰富的数据类型。Redis支持String,List,Hash,Set,ZSet数据类型操作。
  3. 原子性。Redis的所有操作都是原子性的,意思就是要么成功执行,要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,及原子行为通过MULTI和EXEC指令包起来。
  4. 丰富的特性。Redis还支持public/subscribe,通知,key过期等等特性。

Linxu上redis的配置

配置文件一般放在/etc/redis/6379.conf
在配置文件中:
设置密码:搜索requirepass, 去除注释之后在requirepass之后加上你想设置的客户端登录密码。
设置端口:搜索port,默认端口号为6379,如果要修改,直接在port后面加上你想要配置的端口号。
允许远程连接:搜索bind,在127.0.0.1之后加上连接外网的本地网卡地址。

数据类型

在Redis中,命令是不区分大小写的,但是键是严格区分大小写的。并且redis是键值数据库,键是唯一的。

String

操作字符串数据类型:
增加|修改:

1
2
set key value [ex seconds | px ms] :不存在就新增。存在就修改。ex:设置过期秒数,px设置过期毫秒数
setnx ket value: 不存在则新增 存在不修改

查询:

1
2
3
get key:获得key对应的value
getrange key start end :截取字符串
strlen key :获取字符串的长度

删除:

1
del key [key2..key3..]返回删除成功的个数

递增和递减:

1
2
INCR key [ increment]:递增,增量为increment默认为1。
DECRBY key [decrement]:递减,减少量为decrement,默认为1。

追加:

1
APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

Hash类型

适合于存储对象:
类型名+分隔符(:|,|_|&|@)+对象的标识内容
例如:

1
2
User:1
Student:zhangsan

新增:

1
2
HSET key field value:将哈希表 key 中的字段 field 的值设为 value 。
HMSET key field value[field value...]:同时将多个 field-value (域-值)对设置到哈希表 key 中。

查询:

1
2
HGET key field:获取存储在哈希表中指定字段的值。
HMGET key field [field]:获取所有给定字段的值。

List类型

插入的元素 按照顺序存储的,可以重复。
新增:

1
2
从左边插入: LPUSH key value1 [value2 ...]:数据顺序为 value2 value1  
从右边插入:RPUSH key value1 [value2 ...]:数据顺序为 value1 value2

查询:

1
2
LRANGE key start stop :从左往右查询,如果stop为-1则是查询所有
LINDEX key index :查询指定索引的值 (从0开始,从左往右|或者从-1开始,从右往左)

插入:

1
2
LINSERT key BEFORE|AFTER pivot value :在指定元素的前面或后面插入新的元素
例子:LINSERT china before NO.2 NO.1.5 在NO.2的前面插入NO.1.5

修改:

1
LSET key index value:修改指定索引位置的元素

删除:

1
LREM key count value:删除 count个数的值为value的元素 返回移除的个数

出栈:

1
2
3
4
5
LPOP key :移除最左边元素 返回移除的元素 娶(取)不到返回空
RPOP key :移除最右边元素 返回移除的元素 娶(取)不到返回空

BLPOP key timeout:阻塞式的 timeout设置等待时间
BRPOP key timeout:阻塞式的

Set类型

Set类型的特点:无序,不可重复
增加:

1
SADD key member [member ...]

获取:

1
SMEMBERS key

求差级:

1
2
SDIFF key [key]:求差级
SDIFFSTORE destination key [key..]:求差级并保存在destination中

求交集:

1
2
SINTER key [key]:求交集
SINTERSTORE destination key [key ...]:请交集并且保存到destination中

移除等:

1
2
3
4
5
6
7
SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合。
SPOP key 移除并返回集合中的一个随机元素。
SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素。
SRANDMEMBER key [count] 返回集合中一个或多个随机。
SREM key member1 [member2] 移除集合中一个或多个成员。
SUNION key1 [key2] 返回所有给定集合的并集。
SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在destination 集合中。

ZSET类型

ZSET是有序集合
增加:

1
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数

查看

1
2
ZRANGE key start stop [WITHSCORES] :withscores:是否显示分数
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] :和mysql中的limit相似

删除

1
ZREM key member [member ...]

事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  1. 批量操作再发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  2. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:1.开始事务 2.命令入队 3.执行事务
事务有关的命令:

1
2
3
4
5
MULTI  标记一个事务块的开始。
EXEC 执行所有事务块内的命令。
DISCARD 取消事务,放弃执行事务块内的所有命令。
UNWATCH 取消 WATCH 命令对所有 key 的监视。
WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

Java中使用redis

pom.xml中配置jar包

Java连接redis数据库当然少不了jar包了:
需要导入的有:

  1. jedis-2.9.0 .jar
  2. commons-pool2-2.4.2.jar

在pom.xml文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ali</groupId>
<artifactId>redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
</project>

在测试类中

Java中使用redis其实非常简单,连接上redis数据库之后直接调用相应的方法即可,并且方法名和redis命令高度匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.ali.redis;

import static org.hamcrest.CoreMatchers.instanceOf;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.Tuple;

public class RedisTest {

@Test
public void test() {
Jedis jedis = new Jedis("192.168.233.132",6379);//输入ip地址和 端口号
jedis.auth("123456"); //输入密码

//操作String类型的值
jedis.set("name", "豪仔");
String name = jedis.get("name");
System.out.println(name);

//Hash
Map<String, String> map = new HashMap<>();
map.put("username", "Tom");
map.put("age", "19");
jedis.hset("User:"+map.get("username"), map);
List<String> list = jedis.hmget("User:Tom", "username","age");
System.out.println(list);

//list 参考队列

//set 集合 无序且不可重复
jedis.sadd("set", new String[] {"a","b","c"});//新增
//查询
Set<String> set =jedis.smembers("set");
System.out.println(set);

//3.5 zset
Map<String, Double> map2 = new HashMap<>();
map2.put("shenda_shengao", 190.0);
map2.put("shenda_tizhong", 220.0);
jedis.zadd("shenda", map2);

//查询
Set<Tuple> tuples = jedis.zrangeWithScores("shenda", 0, -1);
System.out.println(tuples);
for (Tuple tuple : tuples) {
System.out.println(tuple.getElement());
System.out.println(tuple.getScore());
}

//开启事务
Transaction trans = jedis.multi();//返回一个事务对象
trans.get("myKey");//插入队列
trans.set("youkey2", "hello");//
trans.get("youkey2");//
//执行事务种的命令
List<Object> result = trans.exec();
for (Object object : result) {
System.out.println(object);
}

}

}

-------------本文结束感谢您的阅读-------------