摘录 https://github.com/Romantic-Lei/Learning-in-practice/blob/master/Redis/
官网地址:
英文:Redis
中文:CRUG网站 redis中文文档
安装包:https://redis.io/download/,选择redis7.0版本即可
Redis在线测试地址(不用下载也能玩):Try Redis
Redis命令参考:Redis 命令参考 — Redis 命令参考
Redis的安装
window版安装:
下载地址:GitHub - zkteco-home/redis-windows: Native port of Redis for Windows,it can be installed as service.
linux版安装:
Linux环境安装Redis必须先具备gcc编译环境
1.1什么是gcc?
gcc是linux下的一个编译程序,是C程序的编译工具。 GCC(GNU Compiler Collection)是 GNU(GNU's Not Unix) 计划提供的编译器家族,它能够支持 C,C++, Objective-C, Fortran, Java 和Ada 等等程序设计语言前端,同时能路运在 X86,X86-64,IA-64,PowerPC,SPARC和Alpha 等等几乎目前所有的硬件平台上。鉴于这些特征,以及 GCC 编译代码的高效性,使得 GCC 成为绝大多数自由软件开发编译的首选工具。虽然对于程序员们来说,编译器只是一个工具,除了开发和维护人员,很少有人关注编译器的发展,但是 GCC 的影响力是如此之大,它的性能提升甚至有望改善所有的自由软件的运行效率,同时它的内部结构的变化也体现出现代编译器发展的新特征。
1.2查看gcc版本
gcc -v
1.3安装
·安装redis之前需要具备c++库环境
·yum -y install gcc-c++
10大数据类型
提前声明
这里说的数据类型是value的数据类型,key的类型都是字符串
1.redis字符串(String)
String是redis最基本的数据类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
2.redis列表(List)
Redis列表是最简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的$\textcolor{blue}{头部(左边)或者尾部(右边)}$,它的底层实际是个$\textcolor{red}{双端链表}$,最多可以包含2^32-1个元素(4294967295,每个列表超过40亿个元素)
3.redis哈希表(Hash)
Redis Hash是一个string类型的field(字段)和value(值)的映射表,Hash特别适合用户存储对象。
Redis中每个Hash可以存储2^32-1个键值对(40多亿)
4.redis集合(Set)
Redis的Set是string类型的$\textcolor{red}{无序集合}$。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是intset或者Hashtable。
Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)
5.redis有序集合(ZSet)
zset(sorted set:有序集合)
Redis zset和Set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个类型的分数不同的是每个元素都会关联一个������类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
的成员是唯一的,但是分数()却可以重复。����的成员是唯一的,但是分数(�����)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是。集合中最大的成员数是����集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是�(1)。集合中最大的成员数是2.32−1
6.redis地理空间(GEO)
Redis GEO主要用于存储地理位置信息,并对存储的信息进行操作,包括:
添加地理位置的坐标。
获取地理位置的坐标。
计算两个位置之间的距离。
根据用户给定的经纬度坐标来获取指定范围内的地址位置集合。
7.redis基数统计(HyperLogLog)
HyperLogLog是用来做$\textcolor{red}{基数统计}$的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需要的空间总是固定且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
8.redis位图(bitmap)
由0和1状态表现的二进制位的bit数组
9.redis位域(bitfield)
通过bitfield命令可以一次性操作多个$\textcolor{red}{比特位域(指的是连续的多个比特位)}$,它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应的执行结果。
说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
10.redis流(Stream)
Redis Stream是Redis5.0版本新增加的数据结构。
Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身就是一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。
简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。
而Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
常见数据类型操作命令
Redis键(key)
案例
1.keys *
###查看当前库所有的key
2.exists key
判断某个key是否存在
3.type key
查看你的key是什么类型
4.del key
删除指定的key数据
5.unlink key
非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
del key 是原子的删除,只有删除成功了才会返回删除结果,如果是删除大key用del会将后面的操作都阻塞,而unlink key 不会阻塞,它会在后台异步删除数据。
6.ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期
7.expire key 秒钟
为给定的key设置过期时间
8.move key dbindex[0-15]
将当前数据库的key移动到给定的数据库DB当中
9.select dbindex
切换数据库【0-15】,默认为0
10.dbsize
查看当前数据库key的数量
11.flushdb
清空当前库
12.flushall
通杀全部库
Redis字符串(String)
单值单value
案例:
返回值:
设置成功则返回OK,返回nil为未执行Set命令,如不满足NX,XX条件等。
若使用GET参数,则返回该键原来的值,或在键不存在时nil。
如何获得设置指定的key过期的Unix时间,单位为秒
System.out.println(Long.toString(System.currentTimeMillis()/1000L));
2.同时设置/获取多个键值
MSET key value [key value...]
MGET key [key ...]
mset/mget/msetnx
3.获取指定区间范围内的值
getrange/setrange
数值增减
一定要是数据才能进行加减一定要是数据才能进行加减
递增数字:INCR key
增加指定的整数:INCRBY key increment
递减数值:DECR key
减少指定的整数:DECRBY key decrement
获取字符串长度和内容追加
获取字符串长度:strlen key
字符串内容追加:append key value
分布式锁
setnx key value
setex(set with expire)键秒值/setnx(set if not exist)
getset(先get再set)
getset:将给定key的值设为value,并返回key的旧值(old value)。
简单一句话:先get然后立即set
Redis列表(List)
单key多value
简单说明:$\textcolor{red}{一个双端链表的结构}$,容量是2的32次方减1个元素大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了
他的底层实际上就是个双向链表,对两端的操作性能很高,通过索引下操作中间的节点性能会差
案例:
1.lpush/rpush/lrange 注:没有rrange
2.lpop/rpop
lindex,按照索引下标获得元素(从上到下)
llen,获取List列表中元素的个数
lrem key 数字N 给定值v1
解释:删除N个值等于v1的元素
从left往right删除2个值等于v1的元素,返回的值为实际删除的数量
LREM list3 0 值,表示删除全部给定的值,$\textcolor{red}{零个就是全部值}$
ltrim key 开始index 结束index
截取指定范围的值后在赋值给key
rpoplpush 源列表 目的列表
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
lset key index value
让指定数组集合的小标位置值替换成新值
linsert key before/after 已有值 插入的新值
Redis哈希(Hash)
KV模式不变,但V是一个键值对 Map<String, Map<Object, Object>>
案例:
1.hset/hget/hmset/hmget/hgetall/hdel
hlen
获取某个key内的全部数量
hexists key 在key里面的某个值的key
用于检查哈希表(Hash)中是否存在给定的字段(field)。语法格式如下:
key
: 要检查的哈希表的名称。field
: 在哈希表中要检查的字段名。
此命令返回一个布尔值,如果哈希表key
中存在给定的field
,则返回1
(真),否则返回0
(假)。例如:
HSET myhash field1 value1
HSET myhash field2 value2
HEXISTS myhash field1 # 返回 1,因为 field1 存在于哈希表 myhash 中
HEXISTS myhash field3 # 返回 0,因为 field3 不存在于哈希表 myhash 中
hkeys/hvals
hkeys key 查询出所有key对应的子key值
hvals key 查询出所有key对应的子key的value值
hincrby/hincrbyfloat
hsetnx
不存在赋值,存在了无效
Redis集合(Set)
单值多value,且无重复
1.SADD key member [member ...]
添加元素,可以多次向同一个key中设置不同值,不会覆盖之前的值
2.SMEMBERS key
遍历集合中的所有元素
3.SISMEMBER key member
判断元素是否在集合中
SREM key member [member ...]
删除元素
scard
获取集合里面的元素个数
SRANDMEMBER key [数字]
从集合中随机展现设置的数字个数元素,元素不删除
SPOP key [数字]
从集合中随机弹出一个元素,出一个删除一个
smove key1 key2
将key1里已存在的某个值赋给key2
集合运算-集合的差集运算A-B
属于A但是不属于B的元素构成的集合
SDIFF key [key ...],可以计算多个元素的差集
集合运算-集合的并集运算A∪B
属于A或者属于B的元素构成的集合
SUNION key [key ...]
集合运算-集合运算-集合的交集运算A∩B
属于A同时也属于B的共同拥有的元素构成的集合
SINTER key [key ...]
SINTERCARD numkeys key 【key ...】【LIMIT limit】
numkeys 的具体值由输入的key个数决定
SINTERCARD 为redis7新命令,它不返回结果集,而是返回结果的基数。返回由所有给定集合的交集产生的集合的基数
基数的词语解释: 用于表示事物个数的数
Redis有序集合Zset(sorted set)
在set基础上,每个val值前加一个score分数值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2
案例:
向有序集合中加入一个元素和该元素的分数
1.ZADD key score member [score member ...]
添加元素
2.ZRANGE key start stop [WITHSCORES]
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素
3.zrevrange key start stop [WITHSCORES]
反转集合,按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素
4.ZRANGEBYSCORE key min max 【WITHSCORES】【LIMIT offset count】
获取指定分数范围的元素,可以在min和max前面加个(,表示不包含
limit作用是返回限制,limit开始下标步,一共多少步
5.ZSCORE key member
获取元素的分数
6.ZCARD key
获取集合中元素的数量
7. zrem key member [member ...]
某个score对应的value值,作用是删除元素
8.ZINCRBY key increment member
增加某个元素的分数
9.ZCOUNT key min max
获得指定分数内的元素个数
10.ZMPOP numkeys key [key ...] MIN|MAX [COUNT count]
从键名列表中的第一个非空排序集中弹出一个或多个元素,他们是成员分数对
11.zrank key member [withscore]
作用是通过子value获得下标值
12.zrevrank key member [withscore]
作用是通过子value逆序获得下标值
Redis位图(bitmap)
一句话:由0和1状态表现的二进制位的bit数组
看需求:
- 用户是否登陆过Y、N,比如软件的每日签到功能
- 电影、广告是否被点击播放过
- 钉钉打卡上下班,签到统计
是什么?
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图本质是数组位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32=4294967296)
能干嘛?
用于状态统计,Y、N类似AtomicBoolean
基本命令
1.setbit key offset value
setbit 键偏移位 只能零或者1
Bitmap的偏移量从零开始计算的
getbit key offset
获取键偏移位的值
strlen key
统计字节数占用多少
不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容
bitcount key [start end [byte|bit]]
全部键里面包含有1的有多少个
bitop operation(AND|OR|XOR|NOT) destkey key [key ...]
案例:连续2天都签到的用户数量
假如某个网站或者系统,它的用户有1000W,我们可以使用redis的HASH结构和bitmap结构做个用户id和位置的映射