Redis是目前业界使用最广泛的内存数据存储。

Redis支持丰富的数据结构,同时支持数据持久化。

Redis还提供一些类数据库的特性,比如事务,HA,主从库。

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis支持数据的持久化,可以将内存中的数据保存到磁盘中,重启的时候可以再次加载使用

Redis不仅仅支持简单的key-value类型的数据,同时还支持list,set,zset,hash等数据结构的存储

Redis支持数据的备份

支持主从同步,数据存在内存中,性能卓越。


Redis数据结构

String(字符串)

String是redis最基本的类型,一个key对应一个value

1
2
3
4
127.0.0.1:6379> set name "runoob"
OK
127.0.0.1:6379> get name
"runoob"

set 和 get 命令,key为name,value为runoob。

List(列表)

双向列表,适用于最新列表,关注列表

列表是最简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部或者尾部

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> lpush runoob redis
(integer) 1
127.0.0.1:6379> lpush runoob mongodb
(integer) 2
127.0.0.1:6379> lpush runoob damin
(integer) 3
127.0.0.1:6379> lrange runoob 0 10
1) "damin"
2) "mongodb"
3) "redis"

lpush存入链表,lrange列出链表

Set(集合)

适用于无顺序的集合,点赞点踩,抽奖,已读,共同好友

Redis的Set是String类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找,都是$O(1)$

$asdd$命令:添加一个string元素命令到key对应的set集合中,成功返回1,如果元素已经存在,返回0,key对应的set不存在返回错误。

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> SADD damin redis
(integer) 1
127.0.0.1:6379> SADD damin mysql
(integer) 1
127.0.0.1:6379> SADD damin mongodb
(integer) 1
127.0.0.1:6379> SADD damin mysql
(integer) 0
127.0.0.1:6379> SMEMBERS damin
1) "mongodb"
2) "mysql"
3) "redis"

SortedSet(有序集合)

排行榜,优先队列

和set一样,zadd也是不允许重复的成员

Hash(哈希)

对象属性,不定长属性数

是一个键名对集合

hash特别适合用于存储对象

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"
5) "points"
6) "200"

Redis HMSET , HGETALL 命令,user:1为键值

KV:单一数值,验证码,PV,缓存


启动Redis

1
2
1、用cmd命令转到redis根目录下
2、执行cmd命令:redis-server redis.windows.conf

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 * Created by nowcoder on 2016/7/30.
*/ public class implements InitializingBean {
private static final Logger logger = LoggerFactory.getLogger(JedisAdapter.class);
private JedisPool pool; public static void print(int index, Object obj) {
System.out.println(String.format("%d, %s", index, obj.toString()));
} public static void main(String[] argv) {
Jedis jedis = new Jedis("redis://localhost:6379/9");
jedis.flushDB(); // get set
jedis.set("hello", "world");
print(1, jedis.get("hello")); //输出hello对应的world
jedis.rename("hello", "newhello"); //newhello替代hello
print(1, jedis.get("newhello")); //指向输出world
jedis.setex("hello2", 1800, "world");
print(1,jedis.get("hello2")); jedis.set("pv","100"); //点踩功能
jedis.incr("pv"); //加1
jedis.incrBy("pv",5); //加5
print(2,jedis.get("pv"));
jedis.decrBy("pv",2); //减2
print(2,jedis.get("pv")); print(3,jedis.keys("*")); //输出所有表 String listName ="list";
jedis.del(listName);
for(int i=0;i<10;i++){
jedis.lpush(listName,"a"+String.valueOf(i)); //添加进表
} print(4,jedis.lrange(listName,0,12)); //输出范围0-12的内容
print(4,jedis.lrange(listName,0,2)); //输出范围0-2的内容
print(5,jedis.llen(listName)); //输出长度
print(6,jedis.lpop(listName)); //弹出最前一个的内容
print(10,jedis.linsert(listName,BinaryClient.LIST_POSITION.AFTER,"a4","dd"));
print(11,jedis.lrange(listName,0,11)); String userKey = "userxx";
jedis.hset(userKey,"name","jim");
jedis.hset(userKey,"age","12");
jedis.hset(userKey,"phone","1562225555");
print(12,jedis.hget(userKey,"name")); //取出对应信息
print(13,jedis.hgetAll(userKey)); //全部取出
jedis.hdel(userKey,"phone");
print(14,jedis.hgetAll(userKey)); //取出全部信息
print(15,jedis.hexists(userKey,"email")); //有没有email
print(16,jedis.hexists(userKey,"age")); //有没有age
print(17,jedis.hkeys(userKey)); //输出key
print(18,jedis.hvals(userKey));// 输出值
jedis.hsetnx(userKey,"school","zju"); //添加学校属性
jedis.hsetnx(userKey,"name","yxy"); //如果存在则不改写
print(19,jedis.hgetAll(userKey)); //set
String likeKey1="commentLike1";
String likeKey2="commentLike2";
for(int i=0;i<10 ; ++i){
jedis.sadd(likeKey1,String.valueOf(i));
jedis.sadd(likeKey2,String.valueOf(i*i));
}
print(20,jedis.smembers(likeKey1));
print(21,jedis.smembers(likeKey2));
print(22,jedis.sunion(likeKey1,likeKey2));//求并
print(23,jedis.sdiff(likeKey1,likeKey2));//我有你无
print(24,jedis.sinter(likeKey1,likeKey2)); //求公共的
print(25,jedis.sismember(likeKey1,"12"));
print(25,jedis.sismember(likeKey2,"16")); //查询对象在不在里面
jedis.srem(likeKey1,"5");
print(27 大专栏  Spring Boot 之 Redis详解,jedis.smembers(likeKey1)); User user = new User();
user.setName("xx");
user.setPassword("ppp");
user.setHeadUrl("a.png");
user.setSalt("salt");
user.setId(1);
print(46,JSONObject.toJSONString(user));
jedis.set("user1",JSONObject.toJSONString(user)); String value = jedis.get("user1");
User user2=JSON.parseObject(value,User.class);
print(47,user2);
int k=2;
}
@Override
public void afterPropertiesSet() throws Exception {
}
}

Redis事务

redis事务可以一次执行多个命令,并且有以下2个属性:

事务是一个单独的隔离操作,事务中所有命令都会序列化,按顺序地执行,事务在执行的过程中,不会被其他客户端发送过来的命令请求所中断

事务是一个原子操作,事务中的命令要不全部被执行,要不都不执行

一个事务从开始到执行有三个阶段 :

开始事务

命令入队

执行事务

实例:

先以MULTI开始一个事务,然后将多个命令入队到事务中,最后由EXEC命令触发事务,一并执行事务中的所有命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set book-name "Java Thinking in"
QUEUED
127.0.0.1:6379> GET book-name
QUEUED
127.0.0.1:6379> SADD tag "JAVA" "Coding"
QUEUED
127.0.0.1:6379> SMEMBERS tag
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) "Java Thinking in"
3) (integer) 2
4) 1) "JAVA"
2) "Coding"

事务相关命令:

DISCARD:取消事务discard,放弃执行事务中所有命令

EXEC:执行所有事务块内的命令 exec

MULTI:标记一个事务块的开始multi

UNWATCH:取消watch命令对所有key的监视


Redis脚本

Redis脚本用Lua解释器来执行脚本,脚本执行的命令为EVAL

1
2
3
4
5
127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

Redis 连接

Redis连接服务器

1
2
3
4
5
127.0.0.1:6379> AUTH "password"
(error) ERR Client sent AUTH, but no password is set //没有密码,所以...
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

连接命令:

AUTH password:验证密码是否正确

PONG:查看服务器是否运行

ECHO message : 打印字符串

QUIT:关闭当前连接

SELECT index :切换到指定的数据库


Java使用Redis

添加jedis.jar 包

然后就可以嗨起来了

连接服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String [] args){
//连接本地的Redis服务
Jedis jedis =new Jedis("localhost");
System.out.println("连接成功");
//查看服务器是否运行
System.out.println("服务正在运行:"+jedis.ping());
}
} ---
连接成功
服务正在运行:PONG

字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String [] args){
//连接本地的Redis服务
Jedis jedis =new Jedis("localhost");
System.out.println("连接成功");
jedis.set("damin","zhoudm.com");
System.out.println("redis 存储的字符串为:"+jedis.get("damin"));
}
} ---
连接成功
redis 存储的字符串为:zhoudm.com

Redis Java List

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
import redis.clients.jedis.Jedis;
import java.util.List;
public class RedisJava {
public static void main(String [] args){
//连接本地的Redis服务
Jedis jedis =new Jedis("localhost");
System.out.println("连接成功");
jedis.lpush("zhoudm","zhoudm.com");
jedis.lpush("zhoudm","baidu.com");
jedis.lpush("zhoudm","360.com");
jedis.lpush("zhoudm","google.com"); List<String> list=jedis.lrange("zhoudm",0,3);
for(int i=0;i<list.size();i++) {
System.out.println("列表为:" + list.get(i));
}
}
} ---
连接成功
列表为:google.com
列表为:360.com
列表为:baidu.com
列表为:zhoudm.com

Redis Java Keys

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
import redis.clients.jedis.Jedis;
import java.util.Set;
import java.util.Iterator; public class RedisJava {
public static void main(String [] args){
//连接本地的Redis服务
Jedis jedis =new Jedis("localhost");
System.out.println("连接成功"); Set<String> keys=jedis.keys("*");
Iterator<String> it=keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
}
} ---
连接成功
zhoudm
spring:session:sessions:7ff2fe7e-9454-48a1-b44c-9b5f6b7b1507
book-name
spring:session:sessions:9a02f60c-fd16-49b5-9977-08446f4ffff5
spring:session:sessions:f1312270-95cf-4d19-a88d-5af26b03a61c
spring:session:sessions:expires:9a02f60c-fd16-49b5-9977-08446f4ffff5
spring:session:expirations:1504881480000
user:1
spring:session:sessions:f31624a8-b014-4768-826d-8b5b484b63a7
collector
spring:session:sessions:expires:f1312270-95cf-4d19-a88d-5af26b03a61c
spring:session:sessions:expires:f31624a8-b014-4768-826d-8b5b484b63a7
name
spring:session:expirations:1504409460000
damin
runoob
tag
spring:session:expirations:1505295120000
spring:session:expirations:1504252440000
spring:session:sessions:expires:7ff2fe7e-9454-48a1-b44c-9b5f6b7b1507

Spring Boot 之 Redis详解的更多相关文章

  1. Spring Data操作Redis详解

    Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...

  2. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

  3. Spring Boot 集成 FreeMarker 详解案例(十五)

    一.Springboot 那些事 SpringBoot 很方便的集成 FreeMarker ,DAO 数据库操作层依旧用的是 Mybatis,本文将会一步一步到来如何集成 FreeMarker 以及配 ...

  4. Spring Boot 之 HelloWorld详解

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “以前是人放狗看家,现在是狗牵着人散步” — 随笔 一.Spring Boot 自述 世界上最好 ...

  5. spring boot容器启动详解

    目录 一.前言 二.容器启动 三.总结 =======正文分割线====== 一.前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为 ...

  6. spring boot application.properties详解

    附上最新文档地址:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-propertie ...

  7. Spring Boot启动流程详解(一)

    环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...

  8. Spring Boot Tomcat配置详解

    参数配置容器 server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数,其它类似. 所有参数绑定配置类:org.springframe ...

  9. Spring Boot属性配置文件详解

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...

随机推荐

  1. 干货 | 云解析DNS之网站监控

    云解析是在域名解析的基础上,由京东云团队,结合京东云的优质网络.主机资源研发的高可用.高可靠.功能丰富的权威DNS服务器.云解析拥有简单易用的控制台,方便用户对域名进行操作.采用多集群.多节点部署,拥 ...

  2. c# 异常处理 try --catch

    初学 try---catch 语法 try { 可能会出现异常的代码; 异常出现的那行代码下面的代码全不会执行,直接跳到catch中执行 ... ... } //try和catch之间不能有其他的代码 ...

  3. gcc和g++的区别解析

    1.误区:gcc只能编译C源代码,g++只能编译C++源代码 解析:其实gcc和g++都可以编译c/c++源代码,只是细节不同,后缀名为.c的源文件,gcc将其当作C程序,而g++则当作c++程序来处 ...

  4. 谷歌为何要研发新系统在5年内取代Android?

    现在的Android系统已经越做越好,体验也愈来愈佳,是唯一能和iOS掰腕子的移动操作系统.而且对于很多智能手机厂商来说,开源的Android为它们节约了太多成本,是不可或缺的基石之一.因此,想必很多 ...

  5. 洛谷 P3811 【模板】乘法逆元(欧拉定理&&线性求逆元)

    题目传送门 逆元定义 逆元和我们平时所说的倒数是有一定的区别的,我们平时所说的倒数是指:a*(1/a) = 1,那么逆元和倒数之间的区别就是:假设x是a的逆元,那么 a * x = 1(mod p), ...

  6. JVM学习思维导图

  7. CodeForces 1006E Military Problem(DFS,树的选择性遍历)

    http://codeforces.com/contest/1006/problem/E 题意: 就是给出n,m,共n个点[1,n],m次询问.第二行给出n-1个数a[i],2<=i<=n ...

  8. vim下看C++代码

    看C++代码, 缺少合适的编辑器,捣鼓vim. 安装Vundle, 用于插件管理 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vi ...

  9. regex(python)

    正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/26 16:39 # @Author : jackendoff ...

  10. mysql不常用查询

    --查看数据库版本 SELECT VERSION(); --查看字符编码与安装路径 SHOW VARIABLES LIKE '%char%';