Redis 入门
内容
参考博文:https://www.cnblogs.com/maguanyue/p/12090414.html
一、Redis 概念
Redis 是一个开源的使用 ANSIC 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API;
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型;
Redis 定位是缓存, 提高数据读写速度, 减轻对数据库存储与访问压力。
二、Redis 优缺点
1. 优点
【1】性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s ;
【2】丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作;
【3】原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来;
【4】丰富的特性 – 可用于缓存,消息通知,按key设置过期时间,过期后将会自动删除等。
2. 缺点
【1】 由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
【2】如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。
【3】 Redis并不支持事务回滚,事务虽然可以提交,但不会回滚。
【4】 正因为没有事务回滚,所以存储比较重要的数据,会出现丢失数据的问题。所以比较重要的数据都不会存储在Redis中的,比如有关钱方面的东西,不会存到Redis中的。
三、应用场景
适用场景
-
热点数据的缓存
由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作; -
限时业务的运用
redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景; -
计数器相关问题
redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等; -
排行榜相关问题
关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序; -
分布式锁;
-
延时操作
-
Pub/Sub构建实时消息系统
-
构建队列系统
-
缓存
四、Redis 安装
【1】下载安装包,然后一直下一步,安装到环境变量那一步勾一下,也可以安装完后自己配置,不会就直接百度一下安装教程就好了;
【2】安装完环境变量之后 -> win + R -> 输入 cmd 打开命令窗口 -> 输入 redis-cli (查看 redis 服务是否启动)-> 如果进入了 6379 默认端口或你前面设置的端口则 redis 服务已启动,没启动的话自己去任务管理器服务选项找到 redis 启动即可 -> 在命令窗口的端口号后面输入 ping ,出现 PONG 则 Redis 安装成功。
五、常用命令
1. Redis 字符串(String)
1.1 概念
String类型包含多种类型的特殊类型,并且是二进制安全的.比如序列化的对象进行存储,比如一张图片进行二进制存储.,比如一个简单的。
Map<String, String> map;
1.2 常用命令
序号 | 命令 | 作用 |
---|---|---|
1 | set key value | 设置指定 key 的值(set name yy) |
2 | get key | 获取指定 key 的值 |
3 | incr key | 把值递增1 |
4 | decr key | 把值递减1 |
5 | del key | 根据键删除键值对 |
6 | setex key timeout value | 存入键值对,timeout表示失效时间,单位s |
7 | ttl key | 可以查询出当前的key还剩余多长时间过期 |
8 | setnx key value | 如果key已经存在,不做操作, 如果key不存在,直接添加 |
9 | incrby key num | 偏移值(对值进行加减操作) |
10 | mset k1 v1 k2 v2 … | 批量存入键值对 |
11 | mget k1 k2 | 批量取出键值 |
12 | append key ‘value’ | 原值后拼接新内容 |
13 | setrange key index value | 修改键对应的值,index表示开始的索引位置(从0开始) |
2. Redis 哈希(Hash)
2.1 概念
Hash类型是String类型的field和value的映射表.或者说是一个String集合.它特别适合存储对象,相比较而言,讲一个对象存储在Hash类型里要比存储在String类型里占用更少的内存空间,并方便存储整个对象。
Map<string, Map<string, ?>> map
2.2 常用命令
序号 | 命令 | 作用 |
---|---|---|
1 | hset key hashkey hashvalue | 存入一个hash对象(hset user name yy) |
2 | hget key hashkey | 根据hash对象键取去值 |
3 | hexists key hashkey | 判断hash对象是含有某个键 |
4 | hdel key hashkey | 根据hashkey删除hash对象键值对 |
5 | hincrby key hashkey 递增值 | 递增hashkey对应的值 |
6 | hlen key | 获取hash对象键的数量 |
7 | hkeys key | 获取hash对象的所有键 |
8 | hvals key | 获取hash对象的所有值 |
9 | hgetall key | 获取hash对象的所有数据 |
10 | hsetnx key hashkey hashvalue | 存入键值对,键存在时不存入 |
3. Redis 列表(List)
3.1 概念
Redis中的List类似Java中的queue,也可以当做List来用;
List类型是一个链表结构的集合,其主要功能有push,pop,获取元素等.更详细的说,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,list的设计非常简单精巧,即可以作为栈,又可以作为队列.满足绝大多数需求。
Map<String, List>
3.2 常用命令
序号 | 命令 | 作用 |
---|---|---|
1 | rpush key value [value …] | 往列表右边添加数据(rpush hobby java C++ C C# Python) |
2 | lrange key start end | 范围显示列表数据,全显示则设置0 -1 |
3 | lpush key value [value …] | 往列表左边添加数据 |
4 | lpop key | 弹出列表最左边的数据 |
5 | rpop key | 弹出列表最右边的数据 |
6 | llen key | 获取列表长度 |
7 | linsert key before/after refVal newVal | 参考值之前/后插入数据 |
8 | lset key index value | 根据索引修改数据(索引从0开始) |
9 | lrem key count value | 在列表中按照个数删除数据 |
10 | ltrim key start end | 范围截取列表(LTRIM list 0 2,保留前3个元素,-1表示最后一个元素,-2倒数第二个元素) |
11 | lindex key index | 根据索引取列表中数据 |
4. Redis 集合(Set)
4.1 概念
Set集合是string类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集,并集,差集。
4.2 常用命令
序号 | 命令 | 作用 |
---|---|---|
1 | sadd key value | 往set集合中添加元素(sadd myset aa bb cc dd) |
2 | smembers key | 列出set集合中的元素 |
3 | srem key value | 删除set集合中的元素 |
4 | spop key count | 随机弹出集合中的元素 |
5 | sdiff key1 key2 | 返回key1中特有元素(差集) |
6 | sdiffstore var key1 key2 | 返回key1中特有元素存入另一个set集合 |
7 | sinter key1 key2 | 返回两个set集合的交集 |
8 | sinterstore var key1 key2 | 返回两个set集合的交集存入另一个set集合 |
9 | sunion key1 key2 | 返回两个set集合的并集 |
10 | sunionstore var key1 key2 | 返回两个set集合的并集存入另一个set集合 |
11 | smove key1 key2 value | 把key1中的某元素移入key2中 |
12 | scard key | 返回set集合中元素个数 |
13 | sismember key value | 判断集合是否包含某个值 |
14 | srandmember key count | 随机获取set集合中元素 |
5. Redis 有序集合(sorted set)
5.1 概念
【1】Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员;
【2】不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序;
【3】有序集合的成员是唯一的,但分数(score)却可以重复。
5.2 常用命令
序号 | 命令 | 作用 |
---|---|---|
1 | zadd key score name | 存入分数和名称(zadd contest 100 play1 zadd contest 90 play2) |
2 | zincrby key score name | 偏移名称对应的分数 |
3 | zrange key start end | 在指定分数区间内按照分数升序输出名称 |
4 | zrevrange key start end | 在指定分数区间内按照分数降序输出名称 |
5 | zrank key name | 升序返回排名(0开始) |
6 | zrevrank key name | 降序返回排名(0开始) |
7 | zcard key | 返回元素个数 |
8 | zrangebyscore key min max [withscores] | 按照分数范围升序输出名称 |
9 | zrevrangebyscore key max min [withscores] | 按照分数范围降序输出名称 |
10 | zrem key name | 删除名称和分数 |
11 | zremrangebyscore key min max [withscores] | 根据分数范围删除元素 |
12 | zremrangebyrank key start end | 根据排名删除元素 |
13 | zcount key min max | 按照分数范围统计个数 |
六、Redis 进阶
1. 全局命令
序号 | 命令 | 作用 |
---|---|---|
1 | keys * (可以模糊查询) | 返回满足的所有键 |
2 | exists key [key …] | 是否存在指定 key,返回存在的 key 的个数 |
3 | expire key seconds | 设置某个key的过期时间.使用ttl查看剩余时间 |
4 | persist key | 在时间结束之前取消过期时间 |
5 | flushdb | 清空当前数据库,flushall清空所有数据库 |
6 | select 选择数据库 | 选择数据库 数据库为0到15(一共16个数据库) 默认进入的是0数据库 |
7 | move [key] [数据库下标 | 将当前数据中的key转移到其他数据库中 |
8 | randomkey | 随机返回数据库里的一个key |
9 | rename | 重命名key |
10 | echo | 打印名 |
11 | dbsize | 查看数据库的key数量 |
12 | info | 获取数据库信息 |
13 | config get | 实时传储收到的请求(返回相关的配置信息) |
14 | config get * | 返回所有配置 |
2. Redis 安全
因为redis速度非常快,所以在一台比较好的服务器下,一个外部用户在一秒内可以进行15w次的密码尝试,这意味你需要设定非常强大的密码来来防止暴力破解。
2.1. 修改密码
【1】vi编辑 redis.conf 文件,找到 requirepass [密码] 进行保存修改;
【2】重启服务器 pkill redis-server;
【3】再次进入127.0.01:6379>keys *,出现: (error)NOAUTH Authentication required;
【4】会发现没有权限进行查询auth [密码];
【5】输入密码则成功进入;
【6】每次进入的时候都需要输入免密,还有种简单的方式:redis-cli -a [密码]
3. Redis 事务
3.1 概念
【1】Redis会将一个事务中的所有命令序列化,然后按顺序执行;
【2】单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的;
【3】事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
3.2 事务命令
序号 | 命令 | 作用 |
---|---|---|
1 | MULTI | 标记一个事务块的开始 |
2 | EXEC | 执行所有事务块内的命令 |
3 | UNWATCH | 取消 WATCH 命令对所有 key 的监视 |
4 | DISCARD | 取消事务,放弃执行事务块内的所有命令 |
5 | <