Redis笔记---仅供参考
发布日期:2022-02-28 11:05:49 浏览次数:2 分类:技术文章

本文共 7179 字,大约阅读时间需要 23 分钟。

Redis课程内容

1.入门(软件的安装、设置)

2.通用命令

3.基本数据类型及操作

4. Java连接Redis -->jedis

5.持久化

6.删除策略

7.主从复制

8.哨兵与集群

Redis入门

windows Git Hub下载地址:https://github.com/microsoftarchive/redis/releases

​ Redis的主要作用:缓存数据,是目前缓存的主流技术之一

目前缓存的主流技术:

​ 1. Redis(单线程)

​ 2. Memcached(多线程)

缓存的作用:主要用于改善软件的性能

本地缓存:将热点数据缓存起来,应用程序直接访问而无需访问数据库

分布式缓存:将数据缓存在一个专门的分布式缓存集群中,应用通过网络通信访问缓存数据

Redis的应用场景

  1. 缓存
  2. 任务队列
  3. 应用的排名
  4. 网站访问统计
  5. 数据过期处理

NOSQL

泛指非关系型数据库

常用的非关系型数据库

  • Redis
  • mongoDB

Redis版本结构

​ 相关的设置:

  • 设置连接密码

    修改redis.windowsconf(客户端配置文件),redis.windows.server.conf(服务端配置文件)中的requirpass参数 Eg: requirpass root

  • 测试命令

    ping(测试客户端与服务端是否连接成功)

  • 配置数据库相关的操作

    Redis默认配置了16个数据库,数据库的编号从0开始,即0-15号来表示对应的16个数据库,其默认操作的是0号库

    通过 select 5 命令切换到5号库

    Redis不支持使用数据库自定义数据库名称

    Redis不支持为每个数据库设置访问密码

    Redis的多个数据库之间是相对独立与隔离的,担不是完全的隔离,通过Fushall命令会清空全部数据

    清除命令flushall:清空全部数据库flushDB:只会清空当前操作的库

Redis

特征:

1.多种数据类型的存储

2.内存存储与持久化

  • 内存的读写速度远远比硬盘快

  • 自动提供了持久化功能(RDB,AOF两种方式)

3.其他功能

  • 可用于缓存
  • 支持的生存周期
  • 先进先出的策略

通用的命令

  • select 5 : 命令切换到5号库
  • keys * :查询当前库所有的key
  • type key : 获取键对应的value的数据类型
  • del key[key…] : 删除指定的key value
  • get key : 获取值
  • set key value : 添加一条记录
  • exists key : 判断某个key是否存在 (返回1表示存在,0表示不存在)
  • dbsize : 获取当前数据库下存储的数据记录
  • quit 退出 ping 测试链接是否成功

基本数据类型及操作:

Redis是NOSQL数据库总较为广泛的非关系型内存数据库,Redis内部是一个Key-Value的形式存储,它支持存储的值(value)类型相对比较丰富:

  • String(字符串)
  • list(链表)
  • set(集合)
  • Zset(有序集合[sorted set])
  • hash(哈希类型,类似Java中的Map)

字符串类型

​ 字符串是Redis中最基本的数据类型,它能存储任何形式得字符串,包括二进制,JSON格式的对象,字节数组等,其最大允许得数据容量是512M

set key valueget key
字符串类型常用命令 作用
incr key 递增1
incrby key 增加指定的正数
decr key 递减1
decrby key 减少指定的正数
append key value 向尾部追加值
strlen key 获取字符串的长度
mset 添加多个数据
mget 获取多个数据
命令的详解:
  1. incr key 递增1

    此命令的前提是存储的字符串是整数才能使用,起做ring是让当前键值递增,并返回递增后的值

    127.0.0.1:6379> set classVIP 1OK127.0.0.1:6379> incr classVIP(integer) 2127.0.0.1:6379> incr classVIP(integer) 3127.0.0.1:6379> incr classVIP(integer) 4127.0.0.1:6379> incr classVIP(integer) 5127.0.0.1:6379> get classVIP"5"
  2. incrby key 增加制定的正数

    127.0.0.1:6379> incrby classVIP 10(integer) 15127.0.0.1:6379> incrby classVIP 100(integer) 115
  3. decr key 递减1 ,decrby递减指定的值

  4. append key value 向尾部追加值,如果key不存在则创建key.若key存在则在数值后面添加value(返回的值是字符串的总长度)

    127.0.0.1:6379> append str "Hello"(integer) 5127.0.0.1:6379> get str"hello"127.0.0.1:6379> append str "Redis"(integer) 10127.0.0.1:6379> get str"HelloRedis"
  5. strlen key 获取字符串的长度

    127.0.0.1:6379> strlen str(integer) 10
  6. mset 、mget

    格式:mset k1 v1 k2 v2

    ​ mget k1 k2

    127.0.0.1:6379> mset k1 v1 k2 v2OK127.0.0.1:6379> mget k1 k21) "v1"2) "v2"

list链表

​ list链表是有序的,按照插入的顺序来进行存储,可以添加元素到列表的头部(左边),或者尾部(右边).并且数据内容可以重复

list链表常用命令 作用
lpush key value 头部追加
rpush key value 尾部追加
lrange key index1 index2 分页(遍历)
lrem key index value 删除数据
rpop key 删除最后一条数据

index为下标

命令的详解:
  1. lpush key value : 头部追加一条数据(左侧)

    127.0.0.1:6379> lpush listDemo redis(integer) 1
  2. rpush key value : 尾部追加一条数据(右侧)

    127.0.0.1:6379> rpush listDemo mybatis(integer) 2
  3. lrange key index1 index2 (index为下标) : 查询遍历下标从0开始

    127.0.0.1:6379> lrange listDemo 0 31) "springMVC"2) "redis"3) "mybatis"
  4. lrem listDemo index value : 移除下标对应的数据(正数从左侧开始,负数从右侧开始)

    127.0.0.1:6379> lrange listDemo 0 31) "Boot"2) "spring"3) "redis"4) "mybatis"127.0.0.1:6379> lrem listDemo -1 spring   ##移除从尾部到表头的第一个spring(integer) 1127.0.0.1:6379> lrange listDemo 0 21) "Boot"2) "redis"3) "mybatis"127.0.0.1:6379>

链表(list)的应用场景:

  • 利用lrange可以实现分页操作
  • 博客系统中,博客的评论就可以放在一个list中
  • 微信朋友圈的点赞,按照点赞顺序显示点赞好友的信息

set无序集合(不可重复)

​ set类型中提供了无序的方式来存储多个不同(不能存储重复的元素)的元素,set集合可以快速添加、删除、检查某个元素是否存在,取交集,并集,差集。

set无序集合常用命令 作用
sadd key value[value…] 添加一条或多条数据
smembers key 查询遍历
srem key value[value…] 删除一条数据或多条数据
sismember key value 判断是否有这个值
srandmember key [num] 随机取值 [随即取出num条值]
scard key 获取集合中数据的长度(个数)
spop key 随机获取一条值并删除
命令的详解:
  1. sadd key value[value…] : 添加一条或多条数据

    127.0.0.1:6379> sadd setDemo str1(integer) 1127.0.0.1:6379> sadd setDemo str2 str3 str4 str5(integer) 4
  2. smembers key :查询遍历数据

    127.0.0.1:6379> smembers setDemo1) "str3"2) "str4"3) "str2"4) "str1"5) "str5"
  3. srem key value : 根据value值删除数据

    127.0.0.1:6379> srem setDemo str2 ##删除setDemo里的str2值(integer) 1
  4. sismember key value : 判断是否有这个值(返回1表示有,0表示没有)

    127.0.0.1:6379> sismember setDemo str4   ##判断setDemo里有没有str4(integer) 1127.0.0.1:6379> sismember setDemo str2   ##判断setDemo里有没有str2(integer) 0
  5. srandmember key [num] : 随机取一个或多个值

    127.0.0.1:6379> srandmember setDemo"str1"127.0.0.1:6379> srandmember setDemo"str1"127.0.0.1:6379> srandmember setDemo"str5"127.0.0.1:6379> srandmember setDemo 31) "str5"2) "str4"3) "str1"127.0.0.1:6379> srandmember setDemo 31) "str3"2) "str4"3) "str1"
  6. scard key : 获取几个中数据的长度(个数)

    127.0.0.1:6379> scard setDemo(integer) 4
  7. spop key : 随机获取一条值并删除

    127.0.0.1:6379> smembers setDemo1) "str5"2) "str1"3) "str3"4) "str4"127.0.0.1:6379> spop setDemo"str1"127.0.0.1:6379> smembers setDemo1) "str5"2) "str3"3) "str4"

Zset有序集合(sorted set)(不可重复)

​ 有序集合和set集合一样也是String类型元素的集合,不允许重复

Zset集合中的元素都会关联一个double类型的分数,redis会通过这个分数来为集合中的成员进行从小到大的排序

Zset有序集合(sorted set)常用命令 作用
zadd key index value 添加一条数据
zrange key index1 index2 分页,遍历 (和list分页相同)
zrem key value 删除数据
zcard key 获取集合中数据的长度(个数)
zcount key index1 index2 获取指定范围下标的个数

hash(哈希) 结构:Map<String,Map<String,value>>

hash类型也叫散列类型,存储的是key/value结构,hash存的是字符串与字符串值之间的映射,特别适合存储对象

Eg : 存储user对象(用户的相关信息) Map(String,map<String,String>)

hash(哈希)常用命令 作用
hset key key value ===> Map(String,map<String,String>) 添加一条信息
hexists key key 判断某个字段是否存在
hincrby key key 增加指定的正数(第二个key需为整数)
hdel key key 删除
hkeys key 获取key
hvals key 获取值
hlen key 获取字段的数量
命令详解:
  1. hset key key value

    127.0.0.1:6379> hset user username gx(integer) 1
  2. hexists key key : 判断某个字段是否存在 第一个key为user,第二个key为username

    127.0.0.1:6379> hexists user username ### 判断username字段是否存在(integer) 1
  3. hincrby key key : 增加指定的正数(第二个key需为整数)

    127.0.0.1:6379> hset user age 28(integer) 1127.0.0.1:6379> hincrby user age 2(integer) 30
  4. hdel key key : 删除指定的key

    127.0.0.1:6379> hdel user age(integer) 1
  5. hkeys key : 获取key

    127.0.0.1:6379> hkeys user1) "username"
  6. hvals key : 获取值

    127.0.0.1:6379> hvals user1) "gx"
  7. hlen key : 获取字段的数量

    127.0.0.1:6379> hlen user(integer) 1

持久化

​ 什么是持久化

​ 利用永久存储介质将数据进行保存,在特定时间保存的数据进行读取的过程称为持久化

​ 作用:

​ 防止数据的意外丢失,确保数据安全

​ Redis的持久化方式:

  • RDB(快照) ==》数据 Eg:idea

    将当前数据状态进行保存,快照形式,存储数据结构,存储格式简单,关注点在数据

  • AOF(日志) ==》过程 Eg:eclipse

    将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程中

    虚拟机是以快照的方式来持久化,但是在写文档的时候撤销操作时,返回上一步是AOF方式

生命周期

​ 所谓的生命周期指的是键值对有效期,在redis中可以使用expire命令设置一个键值对的生存时间,到时间后redis会自动删除该记录

expire key1 100    ##key1在100秒后过期   单位:秒ttl key1           ##查看key1剩余的存活时间ttl命令会返回三种值:	-2:表示已经删除	-1:永久有效	大于0的值:剩余的存活时间	pexpire 设置有效时间(单位:毫秒)Eg: pexpire key2 60000  ##有效期为60000毫秒	pttl key2           ##查看有效时间		persist key2 ##清除key2的过期时间,变成长期有效时间戳(某一个时间点)方式表示 Eg: 1598963627 ====》2020-09-01 20:33:47expireat key 1598963627 直接通过ttl查看剩余存活时间pexpireat key 时间戳(毫秒)时间戳相当于定时器,普通的相当于秒表的方式

Redis数据类型综合案例

setex key 60 1   ###setex设置key的默认值存活时间60秒值为1

1.怎么限制每个用户每分钟最多发起10次调用???

​ 思路:此处借用Long类型存储的最大值的特征来进行次数的限制判断

使用setex设置key的默认存活时间60秒,设置value为Long最大值减10,使用incr key递增,当key的值达到最大值时,再次执行就会溢出报错

Java连接Redis -->Jedis

方式:

​ jedis

​ Spring Data Redis

​ lettuce

redis支持的开发语言

​ java,C#,C++,C,PHP,Python,GO,swif/Object-c,VB

//1.连接Jedis jedis = new Jedis("127.0.0.1", 6379); //连接地址  端口号jedis.auth("root"); //连接库的密码

Redis数据库的连接池

Redis事务

概念:

​ Redis事务的本质是一组命令的集合,事务支持一次性执行多个命令,一个事物中的所有命令都会被序列化,在食物执行的过程中,会按照串行的方式顺序的执行队列中的命令

总结:redis事务就是一次性,顺序性,排他性的执行一个队列中一系列的命令

Redis不能保证原子性:

​ redis中单条命令就是原子性执行,但在事务中不能保证原子性

​ 没有回滚操作,事务中任意命令执行失败,其他命令还是会执行.

命令 作用
multi 开启事务
exec 执行事务
discard 取消当前事务

在这里插入图片描述

转载地址:https://blog.csdn.net/weixin_47427198/article/details/108762991 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Maven在idea中的配置操作
下一篇:java代码中编写菱形,九九乘法表,等腰九九乘法表

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月05日 18时06分42秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

注解报错_“步步精心”-Java Annotation注解继承说明 2019-04-21
wdcp安装mysql5.6_安装mysql5.6 2019-04-21
php加载mysql模块_PHP没有加载MySQL扩展模块的解决办法 2019-04-21
mha实现mysql读写分离_MySQL高可用及读写分离(MHA) 2019-04-21
mysql自动提交的概念_MySQL中的事务 2019-04-21
mysql323 mysql40_mysql5的sql文件导入到mysql4的方法 2019-04-21
mysql6.0配置环境变量_linux中 jdk tomcat mysql安装及环境变量配置 2019-04-21
apache远程访问mysql_远程服务器开启https协议,Apache+php+mysql证书配置 2019-04-21
mysql 简朝阳_聚积宝联合创始人& CTO简朝阳——MySQL8核心特性体验 2019-04-21
mapreduce执行过程流程图_Hadoop的MapReduce执行流程图 2019-04-21
mysql查询后生成一张表_mysql 查询记录并插入另一张表 2019-04-21
shell脚本for循环mysql_shell脚本for循环 2019-04-21
mysql mariadb知乎_在 Linux 上检查 MySQL/MariaDB 数据库正常运行时间的三种方法 2019-04-21
python以第一列为索引列_Python-Pandas-DataFrame 如何把df变为以数据中的某一列为index... 2019-04-21
Mysql和JSP之间的联系_建立JSP,MYSQL,FLEX之间的联系 2019-04-21
怎么将mysql中的内容显示到jsp页面_请问老师怎么把数据库中的图片显示在jsp…-体系课... 2019-04-21
python程序设计第三版课后答案第六章_python程序设计 第六章答案 2019-04-21
java 遗传算法_如何用Java实现遗传算法? 2019-04-21
神经猫java代码_纯HTML5制作围住神经猫游戏-附源码下载 2019-04-21
java web 开发目录结构_Java Web 开发的目录结构 2019-04-21