个人学习,此处推荐docker安装,参考docker安装redis
[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]>
> flushall #清空缓存
Redis是开源的,内存中的数据结构存储系统。可以用作数据库、缓存和消息中间件。支持多种类型的数据结构,包括5大基础数据类型和3大特殊数据类型。
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实际上是一个队列。
常用命令:
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之前或之后插入指定的元素
常用命令:
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中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中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 #统计范围内的成员数量
使用场景:朋友圈定位,附近的人,打车距离
命令:
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] # 查询表示地理空间索引的已排序集,以获取与成员之间的给定最大距离匹配的成员
基数统计算法
基数:不重复的元素个数
优点:
占用内存固定,2^64不同元素的数据,只需要12kb的内存。
缺点:
有0.81%的错误率。
场景:
统计网页的UV(用户访问数)
命令:
1. PFADD key [element [element ...]] #添加元素
2. PFCOUNT key [key ...] # 返回基数
3. PFMERGE destkey sourcekey [sourcekey ...] #合并多个基数集合
位图,按位存储状态(0/1)
命令:
1. SETBIT key offset value #设置或清除键处存储的字符串值中偏移量处的位
2. GETBIT key offset #获取指定偏移量的值
3. BITCOUNT key [start end [BYTE|BIT]] #统计指定区间的总和
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
注意:sot 默认使用数字进行排序,如果是字符串需要加ALPHA参数,否则会报错
Redis的排序命令使用(Sort)
redis单条命令保证原子性,但事务不保证原子性。
redis事务:
示例:
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "v1"
取消事务:discard
异常:
示例
##编译异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> cls
(error) ERR unknown command 'cls', with args beginning with:
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
##运行时异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) "v1"
监控,watch实现
两个线程执行:
p1:
127.0.0.1:6379> get money
"80"
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 10
QUEUED
127.0.0.1:6379(TX)> incrby out 10
QUEUED
# 在p1执行之前,执行p2,然后再执行p1会发现p1执行失败
127.0.0.1:6379(TX)> exec
(nil)
p2
127.0.0.1:6379> get money
"80"
127.0.0.1:6379> set money 100
OK
容量单位大小写不敏感
通过inclue可以将多个配置文件读取进来
bind绑定ip
port指定端口
daemonize设置是否以守护进程的方式运行
pidfile如果时守护进程方式运行就需要设置pidfile(/var/run/redis_6379.pid),启动时生产,退出时删除
日志级别loglevel
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
日志文件logfile,默认为空表示不生成日志文件,如果不设置,以守护程序启动,日志文件会输出到/dev/null
databases 数据库数量,默认16个
always-show-logo yes;是否显示logo
持久化:在规定时间内,执行多少次操作,则会持久化到文件 .rdb .aof
1.save
save 900 1 #如果900秒内如果一个key进行了修改,则进行持久化
save 300 10 #300秒内10个key进行了修改,进行持久化
save 60 10000
#在持久化失败时是否继续运行
stop-writes-on-bgsave-error yes
#是否压缩rdb文件
rdbcompression yes
#持久化时是否检查rdb文件
rdbchecksum yes
#rdb文件名称
dbfilename dump.rdb
#rdb文件目录
dir ./
requirepass psw #设置密码
rename-command #重命名命令名称,在共享环境下重命名一些危险的命令,重命名为''则可以禁用一些命令
maxclients 10000 #现在最多允许10000(默认值)个客户端同时连接
maxmemory <bytes> #设置一个内存的限定字节数。当达到限制大小,redis会尝试移除keys。
maxmemory-policy noeviction#内存满后的移除策略
# volatile-lru -> 在过期集合中采用lru策略进行移除
# allkeys-lru -> 所有的key集合中采用lru策略移除
# volatile-lfu -> 设有过期时间的key集合中采用lfu策略移除
# allkeys-lfu -> 所有的key集合中采用lfu策略移除
# volatile-random -> 在设有过期时间的key集合中随机移除
# allkeys-random -> 所有key集合中随机移除
# volatile-ttl -> 移除最近过期的key
# noeviction -> 不做任何处理,仅在写操作时返回一个错误信息
maxmemory-samples 5 #移除时并非全量进行lru,会取用部分样本进行算法计算,该配置设置样本数大小。
replica-ignore-maxmemory yes #副本是否忽略内存管理配置(redis 5开始,副本将忽略该配置)
LRU是最近最少使用页面置换算法,淘汰最长时间未被使用的页面;而LFU是最近最不常用页面置换算法,淘汰一定时期内被访问次数最少的页。LRU关键是看页面最后一次被使用到发生调度的时间长短;而LFU关键是看一定时间段内页面被使用的频率
样本数默认值为5会产生足够好的结果。10非常接近真正的LRU,但需要更多的CPU。3更快,但不是很准确。
appendonly no #默认不开启,默认使用rdb方式持久化,在大部分情况下rdb完全够用。
appendfilename "appendonly.aof"#持久化的文件名字
# appendfsync always #每次修改都会同步,消耗性能
appendfsync everysec # 每秒执行一次同步,可能会丢失这1s的数据
# appendfsync no #关闭同步
redis是内存数据库,所以必须持久化才能保存数据状态。
持久化有两种方式:rdb和AOF;
rdb保存的文件时dump.rdb,rdb是快照。
rdb持久化触发机制:
将所有的命令以日志的形式将所有的写操作记录下来,在启动的时候重新执行写操作。
默认时不开启的,需要手动开启。
保存的文件是appendonly.aof。
如果aof文件被意外篡改了,用redis-check-rdb工具进行修复。修复方式就是把错误的日志命令移除!!!!