windows Git Hub下载地址:https://github.com/microsoftarchive/redis/releases
Redis的主要作用:缓存数据,是目前缓存的主流技术之一
目前缓存的主流技术:
1. Redis(单线程)
2. Memcached(多线程)
缓存的作用:主要用于改善软件的性能
本地缓存:将热点数据缓存起来,应用程序直接访问而无需访问数据库
分布式缓存:将数据缓存在一个专门的分布式缓存集群中,应用通过网络通信访问缓存数据
泛指非关系型数据库
常用的非关系型数据库
相关的设置:
设置连接密码
修改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:只会清空当前操作的库
1.多种数据类型的存储
2.内存存储与持久化
内存的读写速度远远比硬盘快
自动提供了持久化功能(RDB,AOF两种方式)
3.其他功能
Redis是NOSQL数据库总较为广泛的非关系型内存数据库,Redis内部是一个Key-Value的形式存储,它支持存储的值(value)类型相对比较丰富:
字符串是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 | 获取多个数据 |
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"
incrby key 增加制定的正数
127.0.0.1:6379> incrby classVIP 10
(integer) 15
127.0.0.1:6379> incrby classVIP 100
(integer) 115
decr key 递减1 ,decrby递减指定的值
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"
strlen key 获取字符串的长度
127.0.0.1:6379> strlen str
(integer) 10
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链表常用命令 | 作用 |
---|---|
lpush key value | 头部追加 |
rpush key value | 尾部追加 |
lrange key index1 index2 | 分页(遍历) |
lrem key index value | 删除数据 |
rpop key | 删除最后一条数据 |
index为下标
lpush key value : 头部追加一条数据(左侧)
127.0.0.1:6379> lpush listDemo redis
(integer) 1
rpush key value : 尾部追加一条数据(右侧)
127.0.0.1:6379> rpush listDemo mybatis
(integer) 2
lrange key index1 index2 (index为下标) : 查询遍历下标从0开始
127.0.0.1:6379> lrange listDemo 0 3
1) "springMVC"
2) "redis"
3) "mybatis"
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)的应用场景:
set类型中提供了无序的方式来存储多个不同(不能存储重复的元素)的元素,set集合可以快速添加、删除、检查某个元素是否存在,取交集,并集,差集。
set无序集合常用命令 | 作用 |
---|---|
sadd key value[value…] | 添加一条或多条数据 |
smembers key | 查询遍历 |
srem key value[value…] | 删除一条数据或多条数据 |
sismember key value | 判断是否有这个值 |
srandmember key [num] | 随机取值 [随即取出num条值] |
scard key | 获取集合中数据的长度(个数) |
spop key | 随机获取一条值并删除 |
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
smembers key :查询遍历数据
127.0.0.1:6379> smembers setDemo
1) "str3"
2) "str4"
3) "str2"
4) "str1"
5) "str5"
srem key value : 根据value值删除数据
127.0.0.1:6379> srem setDemo str2 ##删除setDemo里的str2值
(integer) 1
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
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"
scard key : 获取几个中数据的长度(个数)
127.0.0.1:6379> scard setDemo
(integer) 4
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"
有序集合和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类型也叫散列类型,存储的是key/value结构,hash存的是字符串与字符串值之间的映射,特别适合存储对象
Eg : 存储user对象(用户的相关信息) Map(String,map
hash(哈希)常用命令 | 作用 |
---|---|
hset key key value ===> Map(String,map |
添加一条信息 |
hexists key key | 判断某个字段是否存在 |
hincrby key key | 增加指定的正数(第二个key需为整数) |
hdel key key | 删除 |
hkeys key | 获取key |
hvals key | 获取值 |
hlen key | 获取字段的数量 |
hset key key value
127.0.0.1:6379> hset user username gx
(integer) 1
hexists key key : 判断某个字段是否存在 第一个key为user,第二个key为username
127.0.0.1:6379> hexists user username ### 判断username字段是否存在
(integer) 1
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
hdel key key : 删除指定的key
127.0.0.1:6379> hdel user age
(integer) 1
hkeys key : 获取key
127.0.0.1:6379> hkeys user
1) "username"
hvals key : 获取值
127.0.0.1:6379> hvals user
1) "gx"
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 时间戳(毫秒)
时间戳相当于定时器,普通的相当于秒表的方式
setex key 60 1 ###setex设置key的默认值存活时间60秒值为1
1.怎么限制每个用户每分钟最多发起10次调用???
思路:此处借用Long类型存储的最大值的特征来进行次数的限制判断
使用setex设置key的默认存活时间60秒,设置value为Long最大值减10,使用incr key递增,当key的值达到最大值时,再次执行就会溢出报错
方式:
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中单条命令就是原子性执行,但在事务中不能保证原子性
没有回滚操作,事务中任意命令执行失败,其他命令还是会执行.
命令 | 作用 |
---|---|
multi | 开启事务 |
exec | 执行事务 |
discard | 取消当前事务 |