Spring Boot 之 Redis详解

Stella981
• 阅读 296

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

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

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

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

Spring Boot 之 Redis详解

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

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

Redis支持数据的备份

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


Redis数据结构

String(字符串)

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

1234

127.0.0.1:6379> set name "runoob"OK127.0.0.1:6379> get name"runoob"

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

List(列表)

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

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

12345678910

127.0.0.1:6379> lpush runoob redis(integer) 1127.0.0.1:6379> lpush runoob mongodb(integer) 2127.0.0.1:6379> lpush runoob damin(integer) 3127.0.0.1:6379> lrange runoob 0 101) "damin"2) "mongodb"3) "redis"

lpush存入链表,lrange列出链表

Set(集合)

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

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

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

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

123456789101112

127.0.0.1:6379> SADD damin redis(integer) 1127.0.0.1:6379> SADD damin mysql(integer) 1127.0.0.1:6379> SADD damin mongodb(integer) 1127.0.0.1:6379> SADD damin mysql(integer) 0127.0.0.1:6379> SMEMBERS damin1) "mongodb"2) "mysql"3) "redis"

SortedSet(有序集合)

排行榜,优先队列

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

Hash(哈希)

对象属性,不定长属性数

是一个键名对集合

hash特别适合用于存储对象

123456789

127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200OK127.0.0.1:6379> HGETALL user:11) "username"2) "runoob"3) "password"4) "runoob"5) "points"6) "200"

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

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


启动Redis

12

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

Redis基础

基本指令功能

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697

 * 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命令触发事务,一并执行事务中的所有命令

12345678910111213141516

127.0.0.1:6379> MULTIOK127.0.0.1:6379> set book-name "Java Thinking in"QUEUED127.0.0.1:6379> GET book-nameQUEUED127.0.0.1:6379> SADD tag "JAVA" "Coding"QUEUED127.0.0.1:6379> SMEMBERS tagQUEUED127.0.0.1:6379> EXEC1) OK2) "Java Thinking in"3) (integer) 24) 1) "JAVA"   2) "Coding"

事务相关命令:

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

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

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

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


Redis脚本

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

12345

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

Redis 连接

Redis连接服务器

12345

127.0.0.1:6379> AUTH "password"(error) ERR Client sent AUTH, but no password is set //没有密码,所以...127.0.0.1:6379> pingPONG127.0.0.1:6379>

连接命令:

AUTH password:验证密码是否正确

PONG:查看服务器是否运行

ECHO message : 打印字符串

QUIT:关闭当前连接

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


Java使用Redis

添加jedis.jar 包

然后就可以嗨起来了

连接服务器

1234567891011121314

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

字符串

1234567891011121314

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

12345678910111213141516171819202122232425

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

1234567891011121314151617181920212223242526272829303132333435363738394041

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);        }    }}--- 连接成功zhoudmspring:session:sessions:7ff2fe7e-9454-48a1-b44c-9b5f6b7b1507book-namespring:session:sessions:9a02f60c-fd16-49b5-9977-08446f4ffff5spring:session:sessions:f1312270-95cf-4d19-a88d-5af26b03a61cspring:session:sessions:expires:9a02f60c-fd16-49b5-9977-08446f4ffff5spring:session:expirations:1504881480000user:1spring:session:sessions:f31624a8-b014-4768-826d-8b5b484b63a7collectorspring:session:sessions:expires:f1312270-95cf-4d19-a88d-5af26b03a61cspring:session:sessions:expires:f31624a8-b014-4768-826d-8b5b484b63a7namespring:session:expirations:1504409460000daminrunoobtagspring:session:expirations:1505295120000spring:session:expirations:1504252440000spring:session:sessions:expires:7ff2fe7e-9454-48a1-b44c-9b5f6b7b1507

Spring Boot 之 Redis详解

Spring Boot 之 Redis详解

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
2个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi /etc/profile2:按字母键i进入编辑模式,在最底部添加内容: JAVAHOME/opt/jdk1.8.0152 CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar PATH$JAVAHOME/bin:$PATH3:生效配置
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
SpringBoot整合Redis乱码原因及解决方案
**问题描述:springboot使用spring data redis存储数据时乱码** **redis key/value 出现\\xAC\\xED\\x00\\x05t\\x00\\x05** * * * 问题分析: 查看RedisTemplate类 ![](https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
1年前
SpringBoot整合Redis乱码原因及解决方案
**问题描述:springboot使用spring data redis存储数据时乱码** **redis key/value 出现\\xAC\\xED\\x00\\x05t\\x00\\x05** * * * 问题分析: 查看RedisTemplate类 ![](https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
1年前
springboot之Redis的使用
spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 ------- Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。
Stella981 Stella981
1年前
Redis快速入门,学会这15点,真的够用了!
**1、Redis简介** REmote DIctionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue