redis入门
了解什么是redis 简单的学习redis的使用
了解常用的redis命令,和redis命令的使用场景
redis简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
master-slave模式:核心思想是基于分而治之的思想,将一个原始任务分解为若干个语义等同的子任务,并由专门的工作者线程来并行执行这些任务,原始任务的结果是通过整合各个子任务的处理结果形成的.主要的使用场景有
- 并行计算,以提升计算性能
- 容错处理,以提升计算的可靠性
- 计算精度,以提高计算的精确程度
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
基本数据结构解释
基本数据结构 | 解释 |
---|---|
字符串类型(String) | string 是 redis 最基本的类型,可以看成与Map中的一模一样的数据类型,一个 key 对应一个value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。 |
列表(list) | Redis 的列表类型( list 类型)可以 存储一个有序的字符串列表 ,常用的操作是向列表两端添加元素,或者获得列表的某一个片段 |
集合(set) | 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的 Redis 内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为 o(1) |
有序集合(sorted set) | 在 set 集合类型的基础上,有序集合类型(sorted set)为集合中的每个元素都 关联一个分数 ,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。 |
散列(Hash) | hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。相当于一个key对应一个map。 |
redis中可执行的文件
文件名 | 解释 |
---|---|
redis-server | Redis服务器 |
redis-cli | Redis命令行客户端 |
redis-benchmark | Redis性能测试工具 |
redis-check-aof | Aof文件修复工具 |
redis-sentinel | Sentinel服务器 |
redis-check-rdb | rdb文件修复工具 |
mkreleasehdr.sh | 编译redis源码时需要用到的一个脚本 |
redis-trib.rb | 官方提供的Redis Cluster的管理工具,因该工具是用ruby开发的,所以需要安装ruby环境。 |
redis的配置文件
文件名 | 解释 |
---|---|
redis.conf | Redis核心配置文件 |
sentinel.conf | Redis sentinel 哨兵配置文件 |
在使用Redis之前,建议将安装目录下redis-5.0.5/redis.conf配置文件修改三个配置项:
1、protected-mode no (改为不保护,否则远程访问不了)
2、bind 127.0.0.1 (注释掉,否则只能本机ip访问)
3、daemonize yes (改为yes表示后台启动redis)
redis常用命令
基本命令
命令 | 解释 |
---|---|
./redis-server …/redis.conf(启动) | redis的启动命令 需要先切换到src目录下(redis-5.0.5/src/) |
./redis-cli shutdown 或者 kill pid 或者 kill -9 pid(关闭) | redis的关闭命令 也是需要在src目录下执行(当redis收到SHUTDOWN命令后,会先断开所有客户端连接,然后根据配置执行持久化,最终完成优雅退出) |
redis生存时间
命令 | 解释 |
---|---|
expire key seconds(生存时间) | 设置key的生存时间 key在xx秒以后自动删除 |
ttl key(查看生存时间) | 查看key剩余的生存时间 |
PERSIST key(清除生存时间) | 清除key的生存时间 |
查看key类型
命令 | 解释 |
---|---|
type key(查看类型) | 显示指定key的类型 |
String数据结构命令
常用命令 | 解释 |
---|---|
keys *(返回 key) | 返回符合给定模式的 key 列表 |
keys us*(返回key) | 返回key前面两个字符为us的key列表 (如果*在两边 就返回包含us字符的key 列表) |
del k1 k2(删除) | 删除key为 k1,k2的key 列表 |
exists key(是否存在) | 用于判断key是否存在 存在返回1 反之返回0 |
set key value(赋值) | 创建一个key 并且赋值 当set操作成功以后会返回“OK” |
get key(取值) | 查看这个key里面的 value值 |
getset key value(取值赋值) | 把之前的值取出来替换为现在写入的值 |
incr key(数值加一) | 如果key不存在则会创建,注意:key对应的值需要是数字类型。作用:当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。 |
incrby key number | 增加指定的整数 (incrby a1 3) |
decr key(数值减一) | 如果key不存在则会创建,注意:key对应的值需要是数字类型。作用:当存储的字符串是整数时,Redis提供了一个实用的命令decr,其作用是让当前键值递减,并返回递减后的值。 |
mset key1 value1 key2 value2….(一次性增加多个) | 一次性创建多个key 列表 相当于get的增强版 比如:mset a1 123 a2 456 a3 789 就会创建三个key.a1,a2,a3 他们的值分别是123,456,789 |
append key value(追加) | 比如key a1 的值是 12 我使用命令 append a1 34 当这个命令执行成功以后 a1的值就变为 1234 |
incr key 图片解释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWacGQLj-1618921050603)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210419171204861.png)]
hash数据类型命令用法
命令 | 解释 |
---|---|
hset key field value(创建hash并赋值) | 例:hset user username zs 创建一个hash类型的user 给user下面的字段名(field)赋一个 zs 的值 |
hget key field(查看值) | 例:hget user username 查看user下面 username的value值 |
hdel key field1 field2…(删除) | 例:hdel user username password 删除 username password |
hexists key field(判断是否存在) | 例: hexists user username 如果这个值不存在就返回0 存在就返回1 |
hkeys key | 获取这个hash类型的 key 下面的所有 字段名 |
hvals key | 获取这个hash类型的key 下面所有字段名的value值 |
hgetall key | 获取这个key下面的所有的字段名和字段名下的value值 |
hincrby key field number | 和incr命令一样 value 都是整数 例:hincrby user uid 2 给user 下面的uid的值增加2 |
hlen key | 获取 key的字段名的数量 |
list数据结构命令用法
命令 | 解释 |
---|---|
lpush key value value … | 让多条数据插入列表的头部(最左边),如果列表不存在,会创建一个空的列表并执行lpush。当key存在但列表类型的时候,返回一个错误 |
rpush key value value … | 用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。 |
lpop key | 用于弹出并返回列表第一个元素 |
rpop key | 用于弹出并返回列表最后一个元素 |
llen key | 获取列表中元素的个数 |
lrem key count value | 根据count参数,删除列表中和value值相同的元素 count的值可以是这几种情况 1.count>0 从表头向表尾搜索,移除和value相等的元素,数量为count个 2…count=0 移除列表中fdfg45gwtrf5gbh6002115 所以和value相同的元素 3.count<0 从表尾向表头搜索,移除和value相等的元素,数量为count个 |
lindex key number | 通过索引获取到列表中的元素 从0开始 ,当然也可以使用负数下标 -1代表最后一个元素 -2 代表最后第二个元素 以此类推 |
ltrim | 对一个列表进行裁减,就是让一个列表只保留指定区间的元素,不在指定区间的元素都删除 0代表第一个元素 -1代表最后一个元素 |
linsert key before(之前)|after(之后) pivot value | linsert 向列表添加元素 before:添加在指定元素的前面 after:添加在指定元素的后面 pivot代表指定元素 value需要插入的值 **返回值:**如果没有找到指定的元素 则返回-1 如果没有key 则返回0 |
set数据结构命令
命令 | 解释 |
---|---|
sadd key value value … | 将一个或者是多个元素添加到集合中,已经存在集合中的元素会被忽略 |
srem key value value … | 将一个或者是多个元素从集合中删除 ,不存在的成员元素会被忽略 |
smembers key | 返回一个集合中的所有成员元素 不存在的集合会被视为空集合 |
smsmember key value | 判断成员元素是否是集合中的元素 存在返回1 不存在返回0 |
sdiff key1 key2 key3 … | 命令返回第一个集合与其他集合之间的差异。也可以认为是第一个集合中的特有元素,不存在的key会视为空集合 例:key1:{1,2,3},key2:{2,4,6},key3:{3,5,6} 返回:{1} |
sinter key1 key2 … | 返回给定所有集合的交集 不存在的集合会被视为空集 如果指定集合中存在空集 返回的结果也是空集 |
sunion key1 key2 … | 返回给定所有集合的并集,不存在的集合会被视为空集 |
scard key | 返回集合的元素个数 |
spop key count | 随机移除集合中的元素 移除一个或者是多个元素 |
sorted set数据结构命令
命令 | 解释 |
---|---|
zadd key score1 value1 score2 value2 … | 将一个或者多个成员元素和元素的分数一起添加到有序列表中 |
WITHSCORES参数 | 如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数 |
zrange key start(开始下标) stop(结束下标) (WITHSCORES) | 返回有序列表中指定区间中的元素 按照成员元素的分数从小到大排序 |
zrevrange key start(开始下标) stop(结束下标) | 返回有序列表中指定区间中的元素 按照成员元素的分数从大到小排序 |
zscore key value | 返回有序集合中指定元素的分数 |
zrem key value … | 移除有序集合中 一个或者多个元素 ,不存在的元素会被忽略 |
zrangebyscore key min max (WITHSCORES) | 获取指定分数以内的元素 |
zincrby key increment(需要添加多少分) value | 给指定的元素增加分值 |