一、Redis概述及安装
1、概述:
1.1、Redis是一个开源的key - value存储系统。
1.2、和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set -- 有序集合)和hash(哈希类型)。
1.3、这些数据类型都支持push/pop、add/remove以及取交集、并集、和差集等更丰富的操作,而且这些操作都是原子性的。
1.4、Redis支持各种不同形式的排序。
1.5、与Memcached一样,为了保证效率,数据都是缓存在内存中。
1.6、Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
2、应用场景
2.1、配合关系型数据库做高速缓存。
2.1.1、高频次、热门访问的数据,降低IO操作。
2.1.2、分布式架构,做session共享。
2.2、多样数据结构存储持久化数据。
3、安装
3.1、下载
3.1.1、前往Redis官网:https://redis.io/
3.1.2、点击下载链接
![](https://i-blog.csdnimg.cn/blog_migrate/eda1760ef610e688a64aec89f9d0eeb2.png)
3.2、安装
3.2.1、Linux系统下安装gcc
![](https://i-blog.csdnimg.cn/blog_migrate/47c06ee94e8e0df96a0ffc301498736f.png)
3.2.2、把下好的压缩包上传至/opt目录下、并解压
![](https://i-blog.csdnimg.cn/blog_migrate/cb3a33121d1abb8eedea832829a8901f.png)
3.2.3、进入解压好的文件夹 进行编译
![](https://i-blog.csdnimg.cn/blog_migrate/c28351b8dd5851b4aa586b6df1556a82.png)
3.2.4、进行安装
![](https://i-blog.csdnimg.cn/blog_migrate/606178084d66561af35d6011ce1e7e14.png)
安装好的文件在/usr/local/bin目录下
3.3、安装目录下(/usr/local/bin)内容简介
3.3.1、redis-benchmark:性能测试工具
3.3.2、 redis-check-aof:修复有问题的AOF文件,后面rdb和aof具体讲述
3.3.3、 redis-sentinel:Redis集群使用
3.3.4、 redis-server:Redis服务启动程序
3.3.5、 redis-cli:客户端操作工具
4、启动
4.1、前台启动:关闭窗口后就不再继续运行
![](https://i-blog.csdnimg.cn/blog_migrate/812373007b2125f6525bcf0778c35518.png)
![](https://i-blog.csdnimg.cn/blog_migrate/16c8e0c64adea8270ede9f2fb08f7ac2.png)
4.2、后台启动
4.2.1、把/opt/redis 6.2.4中的redis.conf复制到/etc下面。
4.2.2、进入/etc目录,使用vim编辑器打开redis.conf配置文件。更改daemonize属性值为yes。
4.2.3、使用redis-server /etc/redis.conf 命令后台启动redis。
4.2.4、可使用进程编号结束运行。
5、Redis相关介绍
5.1、Redis默认有16个数据库,即 0号库 ~ 15号库。
5.2、使用select <dbid>来切换数据库。
5.3、同一密码管理,所有库的密码相同。
5.4、dbsize查看当前库key的数量
5.5、flushdb清空当前库,flushall清空所有库。
5.6、Redis底层是使用单线程+多路IO复用的方式。
6、对于Redis键的操作
6.1、keys * :查看当前库所有的key。
![](https://i-blog.csdnimg.cn/blog_migrate/d8ccf3990955c66aefd4e13c94aa2ff0.png)
6.2、exists key :判断某个key是否存在。
![](https://i-blog.csdnimg.cn/blog_migrate/b494e133c50ea9621e0b161c77de807b.png)
6.3、type key :查看key的类型。
![](https://i-blog.csdnimg.cn/blog_migrate/1d28fa4cc26ccbd3898e7aac9dff830b.png)
6.4、del key :删除指定key的数据。
![](https://i-blog.csdnimg.cn/blog_migrate/827a0e89b30798f6e5a688649af1e6c7.png)
6.5、unlink key :根据key非阻塞删除(异步操作)。
![](https://i-blog.csdnimg.cn/blog_migrate/935884933e9005d462cbd7598b9e3aea.png)
6.6、expire key s :给key设置s秒的过期时间。
![](https://i-blog.csdnimg.cn/blog_migrate/477f8e6ac81274cd7e6ebcc0feee752f.png)
6.7、ttl key :查看key的剩余过期时间。
![](https://i-blog.csdnimg.cn/blog_migrate/81ad1571ec5369988eaf9f63498fb9a2.png)
6.8、select 库编号 :切换数据库。
![](https://i-blog.csdnimg.cn/blog_migrate/847df6391becf9e3c5b59540d473a3f3.png)
6.9、dbsize :查看当前数据库的key的数量。
![](https://i-blog.csdnimg.cn/blog_migrate/5828175a6b5e7be8d73c9148f16d6936.png)
6.10、fiushdb :清空当前数据库。
![](https://i-blog.csdnimg.cn/blog_migrate/a3ee76e27258a279ac9110c07a76f58a.png)
6.11、flushall :清空所有数据库。
二、常用五大数据类型
1、String:Redis字符串
1.1、简介
1.1.1、String是Redis最基本的类型,你可以理解为与Memcached一模一样的类型,一个key对应一个value。
1.1.2、String类型是二进制安全的。意味着Redis的String可以包含任何数据。
1.1.3、String类型是Redis最基本的数据类型,一个字符串value最多可以是512M。
1.2、常用命令
1.2.1、set <key> <value>添加或更新键值对。
![](https://i-blog.csdnimg.cn/blog_migrate/9808bf3b5596b06d57449fc18003c2a8.png)
当key已存在时会更新对应key的value
![](https://i-blog.csdnimg.cn/blog_migrate/4e1c6b8355adc314859c24f9ed07103a.png)
1.2.2、setnx <key> <value> 当数据库中key不存在时可以将key-value添加到数据库
![](https://i-blog.csdnimg.cn/blog_migrate/17c8b10ae7724bcbd013e311d140875d.png)
1.2.3、get <key>查询对应key的值。
![](https://i-blog.csdnimg.cn/blog_migrate/193d1a34f4fd92f623e75a6d14cb7bcb.png)
1.2.4、append <key> <value>将给定的value追加原值的末尾
![](https://i-blog.csdnimg.cn/blog_migrate/768176a762b3af0526f5e7f65f0142ce.png)
1.2.5、strlen <key> 获取值得长度
![](https://i-blog.csdnimg.cn/blog_migrate/29c2e6d13ce03ba3b31195abd5e9a5c0.png)
1.2.6、incr <key> 将key中存储的数字值增1,只能操作数字,如果为空新增值为1。
![](https://i-blog.csdnimg.cn/blog_migrate/86a8107dbea6af162794269f5ad88a7b.png)
1.2.7、decr <key> 将key中存储的数字值减1,只能操作数字,如果为空新增值为-1。
![](https://i-blog.csdnimg.cn/blog_migrate/f40af51a83205f41bca5a891d08b14f7.png)
1.2.8、incrby <key> <num>将key中的值增加指定量。
![](https://i-blog.csdnimg.cn/blog_migrate/20989461e4b203cf4b8ab0008ef6fee0.png)
1.2.9、incrby <key> <num>将key中的值减去指定量。
![](https://i-blog.csdnimg.cn/blog_migrate/91251db0dabe09389ba37fd50a8dfcc9.png)
1.2.10、mset <key1> <value1> <key2> <value2>······ 同时设置一个或多个key-value。
![](https://i-blog.csdnimg.cn/blog_migrate/98d28b6602ed37054bd5e8f7c0f1ae11.png)
1.2.11、mget <key1> <key2> <key3>······同时获取一个或多个value。
![](https://i-blog.csdnimg.cn/blog_migrate/1785d60fe6894053689735f9d09f0a7d.png)
1.2.12、msetnx<key1> <value1> <key2> <value2>······ 同时设置一个或多个key-value,只有所有key都不存在时才能存储成功。
![](https://i-blog.csdnimg.cn/blog_migrate/e9e8e32c78a4e76304385ccd005d9114.png)
具有原子性,有一个失败则都失败。
![](https://i-blog.csdnimg.cn/blog_migrate/9266b7dd8e0b26bd09711a853091b771.png)
1.2.13、getrange <key> <起始位置> <结束位置> 获取key对应value指定位置的值(闭区间)
![](https://i-blog.csdnimg.cn/blog_migrate/d1671f0b629f3d0892f684f7f25a705b.png)
1.2.14、setrange <key> <起始位置> <value>用value覆写起始位置后的值(索引从0开始)。
![](https://i-blog.csdnimg.cn/blog_migrate/d0189bf8557442de6897ec74b09acb4d.png)
1.2.15、setex <key> <过期时间> <value> 设置值得同时设置过期时间,单位秒。
![](https://i-blog.csdnimg.cn/blog_migrate/9e4ec51b3e332ac4e74fa2eac65b87aa.png)
1.2.16、getset <key> <value>以新换旧,设置新值同时获取旧值
![](https://i-blog.csdnimg.cn/blog_migrate/781c39f59089d708db4087c54c636b00.png)
1.3、数据结构
String的数据结构为简单动态字符串(Simple Dynamic String)。是可以修改的字符串,内部结构实现类似Java的ArrayList,采用预分配冗余空间的方式来减少内存分配。
![](https://i-blog.csdnimg.cn/blog_migrate/26cb67afbea1769fbeafda8c85a9be46.png)
内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容一次只会扩容1M的空间。需要注意的是字符串最大长度为512M。
2、List:Redis列表
2.1、简介:
2.1.1、特点:单间多值。
2.1.2、Redis列表是简单的字符串列表,按照插入时的顺序排序。可以选择从列表的头部或尾部添加。
2.1.3、它的底层实际是个双向链表,对两端的操作性能很高,通过索引操作中间索引性能较差。
![](https://i-blog.csdnimg.cn/blog_migrate/50d10284481323babab7730aa7119cbf.png)
2.2、常用命令
2.2.1、lpush/rpush <key> <value1> <value2> <value3>······· 从左边或右边插入一个或多个值。
![](https://i-blog.csdnimg.cn/blog_migrate/22e6b2c36c1252b019fb700183121031.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6ac495f40ef2d637f23fd37a7d8893f2.png)
2.2.2、lpop/rpop <key> 从左边或右边取出一个值。值在键在,值光键亡。
![](https://i-blog.csdnimg.cn/blog_migrate/aca16151133674aab9902f1af4451a8c.png)
2.2.3、rpoplpush <key1> <key2> 从key1列表右边吐出一个值,插到key2列表左边。
![](https://i-blog.csdnimg.cn/blog_migrate/93ce83e60df8814dcd9163900f705cef.png)
2.2.4、lrange <key> <start> <stop>按照下标获得元素(从左到右)。(-1代表右边第一个)
常规用法上方已有操作
获取全部内内容:
![](https://i-blog.csdnimg.cn/blog_migrate/5a002faae0b7824b9f92576f335b130f.png)
2.2.5、lindex <key> <index> 根据索引获取元素(从左至右)。
![](https://i-blog.csdnimg.cn/blog_migrate/b5454c3333774485fe20f5b86f315a2f.png)
2.2.6、llen <key> 获取列表长度
![](https://i-blog.csdnimg.cn/blog_migrate/4327b9c418288eff89702cf2427458e0.png)
2.2.7、linsert<key> before/after <value> <newvalue> 在value 前 / 后 插入newvalue
![](https://i-blog.csdnimg.cn/blog_migrate/54754196699946fac886e5f240c4cfc1.png)
2.2.8、lrem <key> <n> <value>从左边删除n个value(从左至右)。
![](https://i-blog.csdnimg.cn/blog_migrate/c79eda8a22f70f6415bd2592cf3ac8e0.png)
2.2.9、lset <key> <index> <value>将下标为index的值替换为value
![](https://i-blog.csdnimg.cn/blog_migrate/ff143adeb983fc1675e326745fb13e5e.png)
2.3、数据结构
List的数据结构为快速链表。
首先在列表元素比较少的时候使用一块连续的内存存储,这个结构是zipList,即压缩链表。
它将所有的元素紧挨着存储在一起,分配的是一块连续的内存。
当数据量比较多的时候,才会改为quickList。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个而外的指针prev和next。
![](https://i-blog.csdnimg.cn/blog_migrate/8bb39848c51c0c61eab72ec006491562.png)
Redis将链表和zipList结合起来组成了quickList。也就是将多个zipList使用双向指针串起来使用。这样既满足了快速插入性能,又不会出现太大的空间冗余。
3、Set:Redis集合
3.1、简介:
Redis set对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,有不希望出现重复数据时,set是一个很好地选择。并且set提供了判断某个成员是否在一个set集合内的重要接口,这也是list所不能提供的。
Redis的set是String类型的无序集合。它的底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
3.2、常用命令
3.2.1、sadd <key> <value1><value2>······将一个或多个元素加入到集合中,若该集合中已存在某个元素则该重复元素会被忽略。
![](https://i-blog.csdnimg.cn/blog_migrate/d2834fb672edd6efb9f46b025d84e0fd.png)
3.2.2、smembers <key>取出该集合的所有值。
![](https://i-blog.csdnimg.cn/blog_migrate/696b5c5620749c00971025b7f4e17a92.png)
3.2.3、sismember <key> <value> 判断集合中是否包含指定元素,有返回1,没有则返回0。
![](https://i-blog.csdnimg.cn/blog_migrate/688599c0407d5686394b4c625fa775b4.png)
3.2.4、scard <key> 返回该集合的元素个数。
![](https://i-blog.csdnimg.cn/blog_migrate/8ffd6f79bf6e7a42cc7cc8587ff33d0b.png)
3.2.5、srem <key> <value1> <value2> ······删除集合中的元素
![](https://i-blog.csdnimg.cn/blog_migrate/e048e28e9789d4e5e6765860801a3b26.png)
3.2.6、spop <key> 从集合中随机弹出一个元素。
![](https://i-blog.csdnimg.cn/blog_migrate/0ad3f0629b39cc5a4ba1ac9b12b99fb6.png)
3.2.7、srandmember <key> <n> 随机从该集合中取出n个值,但不会从集合中删除。
![](https://i-blog.csdnimg.cn/blog_migrate/e0de646ef5f4f9105941770b8a807a0f.png)
3.2.8、smove <source> <destination> <value> 把集合中的一个元素移动到另一个集合中
![](https://i-blog.csdnimg.cn/blog_migrate/ed8eafa0fe45cfb873b732bd4e0d83c7.png)
3.2.9、sinter <key1> <key2>返回两个集合的交集。
![](https://i-blog.csdnimg.cn/blog_migrate/0fac3b8d755c0b102623033a52ea2a12.png)
3.2.10、sunion <key1> <key2>返回两个集合的并集。
![](https://i-blog.csdnimg.cn/blog_migrate/8ae29d39a0287b446308cfa1754e22b8.png)
3.2.11、sdiff <key1> <key2>返回两个集合的差集。即key1中有但key2中没有的。
![](https://i-blog.csdnimg.cn/blog_migrate/9da3e87b39118b0c8206c020c9b16c39.png)
3.3、数据结构
Set数据结构是dict字典,使用哈希表实现的。
类似于Java中的HashSet内部实现使用的是HashMap,只不过所有的value都指向同一个对象。
Redis的set结构也是一样,它的内部使用的是hash结构,所有的value指向同一个内部值。
4、Hash:Redis哈希
4.1、简介:
Redis Hash是一个键值对集合。
RedisHash是一个String类型的fild和value的映射表,适合用于存储对象信息。
类似Java里的Map<String , Object>。
![](https://i-blog.csdnimg.cn/blog_migrate/861e14db80be66550f360c89e887669c.png)
4.2、常用命令
4.2.1、hset <key> <field> <value> 给key集合中的field赋值value。
![](https://i-blog.csdnimg.cn/blog_migrate/3b9b37d0568d81f98a450ab7e1f35ae7.png)
4.2.2、hget<key><field>从key中取出field对应的值。
![](https://i-blog.csdnimg.cn/blog_migrate/840178128ff404ac0d839993b6db5262.png)
4.2.3、hmset <key> <field1> <value1> <field2> <value2>·······批量设置hash的值。
![](https://i-blog.csdnimg.cn/blog_migrate/9a6375fe5217ba3f73ad6ac19ddecd59.png)
4.2.4、hexists<key><field>查看哈希表key中给定域field是否存在。
![](https://i-blog.csdnimg.cn/blog_migrate/8006e946d3cb70774fd09e2d0a626e99.png)
4.2.5、hkeys <key>列出该集合的所有field。
![](https://i-blog.csdnimg.cn/blog_migrate/2491d6ca477f7a4cc0f31f33d762f0ff.png)
4.2.6、hvals <key>列出该集合的所有value。
![](https://i-blog.csdnimg.cn/blog_migrate/55bdcbf29b7fd668d2be630f6e95bf6a.png)
4.2.7、hincrby <key> <field> <increment> 给key中的field对应的value加上指定值。
![](https://i-blog.csdnimg.cn/blog_migrate/fc774ff6814a63f42f21e09e59641552.png)
4.2.8、hsetnx <key> <field> <value> 给key集合中的field赋值value,只有field不存在时才能添加成功。
![](https://i-blog.csdnimg.cn/blog_migrate/66acab5319d50829741315399d971751.png)
4.3、数据结构
Hash类型对应的数据结构是两种,zipList(压缩列表),hashTable(哈希表)。当field-value长度较短,且个数较少时使用zipList,否则使用hashTable。
5、Zset:Redis有序集合
5.1、简介:
zset与普通集合set相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分,这个评分按照从低到高的方式排列集合成员。集合的成员是唯一的,但是评分是可以重复的。
5.2、常用操作
5.2.1、zadd <key> <score1> <value1> <score2> <value2>·······将一个或多个member元素及其score值加入到key中。
![](https://i-blog.csdnimg.cn/blog_migrate/724b1d2b2f7a12ebc911c52390c43186.png)
5.2.2、zrange <key> <start> <stop> 返回有序集合中下标在start和stop之间的元素
![](https://i-blog.csdnimg.cn/blog_migrate/25f812e756714aeda898017d04431144.png)
5.2.3、zrangebyscore <key> <min> <max>返回有序集合中score值介于min和max之间的成员,按score递增的方式排列。
![](https://i-blog.csdnimg.cn/blog_migrate/95238066ef3c95ff03f830087440cbb4.png)
5.2.4、zrevrangebyscore <key> <min> <max>返回有序集合中score值介于min和max之间的成员,按score递递减的方式排列。
![](https://i-blog.csdnimg.cn/blog_migrate/0abaceefd463cc9b8af4d6152e82d007.png)
5.2.5、zincrby <key> <increment> <value> 为元素的score加上增量。
![](https://i-blog.csdnimg.cn/blog_migrate/739af42cd7543ea81f9386bde2a93cf2.png)
5.2.6、zrem <key> <value> 删除该集合下指定的元素。
![](https://i-blog.csdnimg.cn/blog_migrate/f66cc35441ddfc07158cd344ada3bd85.png)
5.2.7、zcount<key> <min> <max>统计该集合分数区间元素个数。
![](https://i-blog.csdnimg.cn/blog_migrate/fd8aae8d90658140a47882fcb6495bf2.png)
5.2.8、zrank <key> <value> 返回该值在集合中的排名。(从小到大排)
![](https://i-blog.csdnimg.cn/blog_migrate/52be761e3062f76c130c60bc7e835893.png)
5.3、数据结构
zset底层使用了两个数据结构
(1)、hash,hash的作用就是关联value和权重score,保障元素value的唯一性,可以通过value找到相应的score值。
(2)、跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。