本文已参与「新人创作礼」活动,一起开启掘金创作之路。
安装redis
个人学习,此处推荐docker安装,参考docker安装redis
redis基础知识
- redis默认是16个数据库,默认使用第一个,可以用select切换。
[root@localhost ~]# docker exec -it redis /bin/bash
root@3cc572b8971a:/data# redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
- redis是单线程的,redis是基于内存操作的,cpu不是redis的性能瓶颈,redis的瓶颈是机器内存和网络带宽。
数据类型
Redis是开源的,内存中的数据结构存储系统。可以用作数据库、缓存和消息中间件。支持多种类型的数据结构,包括5大基础数据类型和3大特殊数据类型。
5大基础数据类型
String
String应该是用得最多的数据类型,用来缓存个什么东西很方便。常说不会用redis的就只会用个String来当缓存用。万物都存储在String里面。
常用命令:
1. set key value #设置KV
2. get key #获取K对应的V
3. keys * #获取所有的Key
4. exits key #判断Key是否存在
5. MOVE key db #移动一个key到对应的db里面去
6. DEL key [key ...] #移除key
7. incr key # key对应的value自增1,不存在key则会创建
8. decr key #key对应的value自减1,不存在key则会创建
9. incrby key num
10. decrby key num
11. getrange key start end #获取value的子串
12. setrange key offset value #将key的value从offset位置修改成value
13. setex #设置key的过期时间
14. setnx #不存在则set,存在则不set(常用分布式锁)
15. mset #批量设置kv
16. mget #批量获取kv
17. msetnx #同时设置多个kv,一个失败则全失败。
18. getset #获取旧的值,同时设置新的值
List
List实际上是一个队列。 常用命令:
1. lpush #一个或多个value从对头入列
2. rpush #一个或多个value从队尾入列
3. LRANGE key start stop # 获取度列中从start到stop的元素列表
4. LINDEX key index # 通过下标获取一个元素
5. llen key # 获取集合长度
6. lpop key #队头取出一个元素
7. LREM key count element # 从list中移除count个element 元素
8. ltrim key start stop # 截取start到stop的元素
9. rpoplpush source dest # source pop 然后push到dest
10. LSET key index element # 设置index位置的值
11. LINSERT key BEFORE|AFTER pivot element # 往key指定元素pivot之前或之后插入指定的元素
Set
常用命令:
1. SADD key member [member ...] # 添加一个或多个元素
2. SMEMBERS key # 获取所有的元素
3. SISMEMBER key member # 判断member是否在集合中
4. SCARD key # 获取集合中元素个数
5. SRANDMEMBER key [count] #从集合中随机获取count个元素
6. SREM key member [member ...]#从集合中移除指定元素
7. SPOP key [count] #从集合中移除并返回count个成员
8. SMOVE source destination member # 将source中的member移动到destination中
9. SDIFF key [key ...] # 前面集合减去后面集合
10. SINTER key [key ...]# 多个集合相交
11. SDIFFSTORE destination key [key ...] #将多个集合的交集写入到destination中
12. SINTERSTORE destination key [key ...] #将多个集合的并集写入到destination中
Map
map中field唯一不重复 常用命令:
1. HSET key field value [field value ...] #设置map的field和value
2. HMSET key field value [field value ...] #设置Map的filed和value,和HSET的差别在于HSET会返回插入的元素个数,如果fileld已经存在则返回0
3. HGET key field #获取对应的field的值
4. HMGET key field [field ...] #获取多个field的值
5. HGETALL key #获取所有的field和值
6. HLEN key #获取map的大小
7. HEXISTS key field #判断field是否存在
8. HVALS key #获取所有的值
9. HINCRBY key field increment #将哈希字段的整数值递增给定的数字
10. HSETNX key field value #当field不存在是设置值
ZSet
zset中member不唯一,可重复
1. ZADD key score member [score member ...] # 将一个或多个成员添加到排序集,或更新其分数(如果已存在)
2. ZRANGE key min max [WITHSCORES] # 返回排序集中的成员
3. ZRANGEBYLEX key min max [LIMIT offset count] # 按字典顺序返回,注意参数min和max必须带(或[,如:zrangebylex mz (1 [z
4. ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] #按分数返回,注意,这里的min和max不需要(和[,如:zrangebyscore mz 1.0 2.0
5. ZREVRANGE key start stop [WITHSCORES] # 分数从高到低排列返回
6. ZREM key member [member ...]#移除指定元素
7. ZCOUNT key min max #统计范围内的成员数量
3大特殊数据类型
geospatital地理位置
使用场景:朋友圈定位,附近的人,打车距离 命令:
1. GEOADD key longitude latitude member [longitude latitude member ...]#录入一个或多个经纬度点信息,两级无法添加。
2. GEOHASH key member [member ...] #以标准的geohash字符串返回成员的位置信息
3. GEOPOS key member [member ...] # 返回地理空间上的经纬度
4. GEODIST key member1 member2 [M|KM|FT|MI] #返回两个成员之间在地理位置上的距离
5. GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]# 查询表示地理空间索引的已排序集,以获取与某个点的给定最大距离匹配的成员
6. GEORADIUSBYMEMBER key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] # 查询表示地理空间索引的已排序集,以获取与成员之间的给定最大距离匹配的成员
Hyperloglog
基数统计算法
基数:不重复的元素个数
优点:
占用内存固定,2^64不同元素的数据,只需要12kb的内存。
缺点:
有0.81%的错误率。
场景:
统计网页的UV(用户访问数)
命令:
1. PFADD key [element [element ...]] #添加元素
2. PFCOUNT key [key ...] # 返回基数
3. PFMERGE destkey sourcekey [sourcekey ...] #合并多个基数集合
BitMap
位图,按位存储状态(0/1) 命令:
1. SETBIT key offset value #设置或清除键处存储的字符串值中偏移量处的位
2. GETBIT key offset #获取指定偏移量的值
3. BITCOUNT key [start end [BYTE|BIT]] #统计指定区间的总和