redis是什么
Redis是完全开源免费的,高性能的key-value数据库。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
为什么使用redis
- 性能高。Redis读的速度是110000次/s,写的速度是81000次/s。
- 丰富的数据类型。Redis支持String,List,Hash,Set,ZSet数据类型操作。
- 原子性。Redis的所有操作都是原子性的,意思就是要么成功执行,要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,及原子行为通过MULTI和EXEC指令包起来。
- 丰富的特性。Redis还支持public/subscribe,通知,key过期等等特性。
Linxu上redis的配置
配置文件一般放在/etc/redis/6379.conf
在配置文件中:
设置密码:搜索requirepass, 去除注释之后在requirepass之后加上你想设置的客户端登录密码。
设置端口:搜索port,默认端口号为6379,如果要修改,直接在port后面加上你想要配置的端口号。
允许远程连接:搜索bind,在127.0.0.1之后加上连接外网的本地网卡地址。
数据类型
在Redis中,命令是不区分大小写的,但是键是严格区分大小写的。并且redis是键值数据库,键是唯一的。
String
操作字符串数据类型:
增加|修改:1
2set key value [ex seconds | px ms] :不存在就新增。存在就修改。ex:设置过期秒数,px设置过期毫秒数
setnx ket value: 不存在则新增 存在不修改
查询:1
2
3get key:获得key对应的value
getrange key start end :截取字符串
strlen key :获取字符串的长度
删除:1
del key [key2..key3..]返回删除成功的个数
递增和递减:1
2INCR key [ increment]:递增,增量为increment默认为1。
DECRBY key [decrement]:递减,减少量为decrement,默认为1。
追加:1
APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
Hash类型
适合于存储对象:
类型名+分隔符(:|,|_|&|@)+对象的标识内容
例如:1
2User:1
Student:zhangsan
新增:1
2HSET key field value:将哈希表 key 中的字段 field 的值设为 value 。
HMSET key field value[field value...]:同时将多个 field-value (域-值)对设置到哈希表 key 中。
查询:1
2HGET key field:获取存储在哈希表中指定字段的值。
HMGET key field [field]:获取所有给定字段的值。
List类型
插入的元素 按照顺序存储的,可以重复。
新增:1
2从左边插入: LPUSH key value1 [value2 ...]:数据顺序为 value2 value1
从右边插入:RPUSH key value1 [value2 ...]:数据顺序为 value1 value2
查询:1
2LRANGE key start stop :从左往右查询,如果stop为-1则是查询所有
LINDEX key index :查询指定索引的值 (从0开始,从左往右|或者从-1开始,从右往左)
插入:1
2LINSERT 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
5LPOP key :移除最左边元素 返回移除的元素 娶(取)不到返回空
RPOP key :移除最右边元素 返回移除的元素 娶(取)不到返回空
BLPOP key timeout:阻塞式的 timeout设置等待时间
BRPOP key timeout:阻塞式的
Set类型
Set类型的特点:无序,不可重复
增加:1
SADD key member [member ...]
获取:1
SMEMBERS key
求差级:1
2SDIFF key [key]:求差级
SDIFFSTORE destination key [key..]:求差级并保存在destination中
求交集:1
2SINTER key [key]:求交集
SINTERSTORE destination key [key ...]:请交集并且保存到destination中
移除等:1
2
3
4
5
6
7SMOVE 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
2ZRANGE key start stop [WITHSCORES] :withscores:是否显示分数
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] :和mysql中的limit相似
删除1
ZREM key member [member ...]
事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 批量操作再发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:1.开始事务 2.命令入队 3.执行事务
事务有关的命令:1
2
3
4
5MULTI 标记一个事务块的开始。
EXEC 执行所有事务块内的命令。
DISCARD 取消事务,放弃执行事务块内的所有命令。
UNWATCH 取消 WATCH 命令对所有 key 的监视。
WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
Java中使用redis
pom.xml中配置jar包
Java连接redis数据库当然少不了jar包了:
需要导入的有:
- jedis-2.9.0 .jar
- 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
71package 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);
}
}
}