Spring Boot 之 Redis详解

Stella981
• 阅读 600

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详解

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
springboot之Redis的使用
springboot对常用的数据库支持外,对nosql数据库也进行了封装自动化。redis介绍Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes,lists,sets等,同时支持数据持久化。除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库。
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis快速入门,学会这15点,真的够用了!
1、Redis简介REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的keyvalue存储系统。Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、KeyValue数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这