Redis笔记---仅供参考

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 value
get 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 1
    OK
    127.0.0.1:6379> incr classVIP
    (integer) 2
    127.0.0.1:6379> incr classVIP
    (integer) 3
    127.0.0.1:6379> incr classVIP
    (integer) 4
    127.0.0.1:6379> incr classVIP
    (integer) 5
    127.0.0.1:6379> get classVIP
    "5"
    
  2. incrby key 增加制定的正数

    127.0.0.1:6379> incrby classVIP 10
    (integer) 15
    127.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) 5
    127.0.0.1:6379> get str
    "hello"
    127.0.0.1:6379> append str "Redis"
    (integer) 10
    127.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 v2
    OK
    127.0.0.1:6379> mget k1 k2
    1) "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 3
    1) "springMVC"
    2) "redis"
    3) "mybatis"
    
  4. lrem listDemo index value : 移除下标对应的数据(正数从左侧开始,负数从右侧开始)

    127.0.0.1:6379> lrange listDemo 0 3
    1) "Boot"
    2) "spring"
    3) "redis"
    4) "mybatis"
    127.0.0.1:6379> lrem listDemo -1 spring   ##移除从尾部到表头的第一个spring
    (integer) 1
    127.0.0.1:6379> lrange listDemo 0 2
    1) "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) 1
    127.0.0.1:6379> sadd setDemo str2 str3 str4 str5
    (integer) 4
    
  2. smembers key :查询遍历数据

    127.0.0.1:6379> smembers setDemo
    1) "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) 1
    127.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 3
    1) "str5"
    2) "str4"
    3) "str1"
    127.0.0.1:6379> srandmember setDemo 3
    1) "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 setDemo
    1) "str5"
    2) "str1"
    3) "str3"
    4) "str4"
    127.0.0.1:6379> spop setDemo
    "str1"
    127.0.0.1:6379> smembers setDemo
    1) "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) 1
    127.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 user
    1) "username"
    
  6. hvals key : 获取值

    127.0.0.1:6379> hvals user
    1) "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:47
expireat 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取消当前事务

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java.小小白

生活不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值