Redis 是咱们在互联网应用中使用最普遍的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库。c++
Redis 这个名字是 Remote Dictionary Service 字母缩写。redis
不少人想到 Redis,就想到缓存。但实际上 Redis 除了缓存以外,还有许多更加丰富的使用场景。好比分布式锁,限流。docker
四种方式获取一个 Redis:shell
直接编译安装(推荐使用)数据库
提早准备好 gcc 环境缓存
yum install gcc-c++
接下来下载并安装 Redis:数据结构
wget https://download.redis.io/releases/redis-6.2.1.tar.gz tar -zxvf redis-6.2.1.tar.gz cd redis-6.2.1/ make make install
安装完成后,启动 Redis:app
redis-server redis.conf
启动成功页面以下:分布式
使用Docker工具
Docker 安装好以后,启动 Docker ,直接运行安装命令便可,启动后返回容器运行的ID
docker run --name taoguoguo-redis -d -p 6379:6379 redis --requirepass 123
咱们先查看运行在Docker上的redis容器
docker ps
确保容器正在运行后,能够从宿主机上链接(前提是宿主机上存在 redis-cli),由于第一种编译安装方式咱们已经在宿主机上安装了redis 因此能够直接使用宿主机的命令行工具
#redis-cli 客户端命令 默认参数有地址 -h 127.0.0.1 端口 -p 6379 密码 -a '123' redis-cli -a 123
宿主机客户端,链接成功!
若是宿主机上没有安装 Redis,那么也能够进入到 Docker 容器种去操做 Redis:
#1.退出当前redis exit #2.进入Redis容器 docker exec -it taoguoguo-redis redis-cli -a 123
也能够直接安装
CentOS
yum install redis
Ubuntu
apt-get install redis
Mac
brew install redis
经过在线体验,使用Redis的相关功能 http://try.redis.io/
首先,修改 redis.conf 配置文件,将daemonize 守护线程启动方式开启
配置完成后,保存退出,启动 redis
redis-server redis.conf
String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,因此的 key 都是字符串(序列化后的字符串),可是,不一样的 key 对应的 value 则具有不一样的数据结构,咱们所说的五种不一样的数据类型,主要是指 value 的数据类型不一样。
Redis 中的字符串是动态字符串,内部是能够修改的,像 Java 中的 StringBuffer,它采用分配冗余空间的方式来减小内存的频繁分配。在 Redis 内部结构中,通常实际分配的内存会大于须要的内存,当字符串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大 512M。
set 就是给一个 key 赋值的。
使用 append 命令时,若是 key 已经存在,则直接在对应的 value 后追加值,不然就建立新的键值对。
能够实现对 value 的减 1 操做(前提是 value 是一个数字),若是 value 不是数字,会报错,若是value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。
和 decr 相似,可是能够本身设置步长,该命令第二个参数就是步长。
好比把K3 的值 减10 设置每次递减的步长为10便可
get 用来获取一个 key 的 value。
getrange 能够用来返回 key 对应的 value 的子串,这有点相似于 Java 里边的 substring。这个命令第二个和第三个参数就是截取的起始和终止位置,其中,0表示起始字符串,-1 表示最后一个字符串,-2 表示倒数第二个字符串,以此类推...
注意:原来存在在redis中 key对应的value 不会发生改变
获取并更新某一个 key。
给某一个 key 的 value 自增
给某一个 key 的 value 自增,同时还能够设置步长
和 incrby 相似,可是自增的步长能够设置为浮点数。 incrby 是不能够增长浮点数的
批量获取和批量存储
查看 key 的有效期, -1 表明永远不会过时 , -2 表明已通过期
在给 key 设置 value 的同时,还设置过时时间,时间到了
和 setex 相似,只不过这里的时间单位是毫秒(1000ms = 1s)。
默认状况下, set 命令会覆盖已经存在的 key,setnx 则不会。
批量设置,若是有一个存在,整个操做会失败。
指定offset(偏移量) 覆盖一个已经存在的 key 的value
查看字符串长度
在 Redis 中,字符串都是以二进制的方式来存储的。例如 set k1 a,a 对应的 ASCII 码是 97,97 转为二进制是 01100001,BIT 相关的命令就是对二进制进行操做的。
key 对应的 value 在 offset 处的 bit 值
修改 key 对应的 value 在 offset 处的 bit 值
统计二进制数据中 1 的个数, 采用位
bitCount应用场景举例,假设我要记录测算系统每一个用户当前登陆的次数,好比用户名为: taoguoguo
#命令以下 setbit key 当前登陆次数 偏移量 #第一次登陆 setbit taoguoguo 1 1 #第二次登陆 setbit taoguoguo 2 1 #第三次登陆 setbit taoguoguo 3 1 #当前登陆次数统计 bitcount taoguoguo
Redis中的List其实是一个string
类型的双向链表,所以既能够作栈也能够作队列来使用。不一样的是栈是先进后出,队列是先进先出。链表被普遍地用于实现Redis的各类功能,如列表键、发布与订阅、慢查询、监视器等。Redis中单个List可容纳2^32-1
约40亿个元素
链表的特色:
将全部指定的值插入到存于 key 的列表的头部。若是 key 不存在,那么在进行 push 操做前会建立一个空列表。 若是 key 对应的值不是一个 list 的话,那么会返回一个错误。
向存于 key 的列表的尾部插入全部指定的值。
返回列表指定区间内的元素,索引从0开始,-1为最后一个。
移除并返回列表的头元素。
移除并返回列表的尾元素。
返回列表中,下标为 index 的元素。
ltrim 能够对一个列表进行修剪,相似于subList。
阻塞式的弹出,至关于 lpop 的阻塞版,若是当前List数据为空,那么在阻塞时长内若是有添加元素 会进行弹出,若是没有元素加入,命令超过期间自动中止。
另外一客户端在阻塞时间加入新元素至k1链表
Redis 的 Set 是 String 类型的无序集合。集合成员是惟一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2^32 - 1 (4294967295, 每一个集合可存储40多亿个成员)。
添加元素到一个 key 中
获取一个 key 下的全部元素
移除指定的元素
返回某一个成员是否在集合中, 0 表明不存在, 1表示存在
返回集合的数量
随机返回一个元素
随机返回而且出栈一个元素
把一个元素从一个集合移到另外一个集合中去
返回两个集合的差集,不一样集合的顺序,差集结果是不同的
返回两个集合的交集
这个相似于 sdiff ,不一样的是,计算出来的结果会保存在一个新的集合中
相似于 sinter,只是将计算出来的交集保存到一个新的集合中
求并集
求并集而且将结果保存到新的集合中
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每一个 hash 能够存储 2^32 - 1 键值对(40多亿)。
添加值
获取值
批量设置
批量获取
删除一个指定的 field
默认状况下,若是 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会
获取全部的 value
获取全部的 key
同时获取全部的 key 和 value
返回 field 是否存在, 0 不存在, 1存在
给指定的 value 自增
能够自增一个浮点数
返回 某一个 key 中 value 的数量
返回某一个 key 中的某一个 field 的字符串长度
Redis 有序集合和集合同样也是 string 类型元素的集合,且不容许重复的成员。
不一样的是每一个元素都会关联一个 double 类型的分数。redis 正是经过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是惟一的,但分数(score)却能够重复。
集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每一个集合可存储40多亿个成员)。
将指定的元素添加到有序集合中
返回 member 的 score 值
返回集合中的一组元素,能够加上 withscores
连同分数一块儿返回
返回一组元素,可是是倒序
返回元素个数
返回 score 在某一个区间内的元素,默认是闭区间,若是要开区间 在 score值 前面加上 (
按照 score 的范围返回元素
返回元素的排名(从小到大)
返回元素排名(从大到小)
score自增
给两个集合求交集,给交集求和
弹出一个元素
计算有序集合中成员数量
返回指定区间内的成员
删除一个 key/value
序列化给定的 key
判断一个 key 是否存在
查看一个 key 的有效期 , -1 永不过时 , -2 已通过期
给一个 key 设置有效期,若是 key 在过时以前被从新 set 了,则过时时间会失效
移除一个 key 的过时时间
查看全部的 key
和 ttl 同样,只不过这里返回的是毫秒