Redis--基础总结
Redis
一:初识Redis
1、Redis 是什么?
一款开源的基于C语言的内存的键值对存储数据库,支持多种数据结构如:Set、hash、List、Zset、等,高性能的内存数据库。
2、Redis 特性 速度快 (10W Ops、单线程)
持久化 (可异步保存到磁盘,断电后不丢失数据)
多种数据结构
支持多种编程语言
功能丰富
简单
主从复制
高可用、分布式
3、应用场景
缓存、计数器、消息队列、排行榜、社交网络、实时系统、会话存储、
4、安装 官方地址:https://redis.io/download
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
运行服务端
$ src/redis-server
客户端访问
$ src/redis-cli
备注: 可以建立一个软连接以备后续升级: ln -s redis-5.0.4 redis
5、启动方式 简单启动 sh 、动态参数启动、配置文件启动
默认端口:6379
停止方式为:shoutdown 这样Redis可以保存相关操作后再进行关闭。
指定修改后的conf启动:/opt/software/redis-5.0.4/src/redis-server /opt/software/redis-5.0.4/redis.conf
配置文件修改:
关闭默认本地访问:#bind 127.0.0.1
关闭守护进程:protected-mode no
设置访问密码:requirepass password
本机访问 src/redis-cli 连接后输入验证:auth root
6、Redis常用配置
daemonize 是否守护进程(no/yes)修改成yes 可以进行日志记录
port 设置对外访问端口默认:6379
logfile: 日志名称,记录日志
dir:Redis工作目录
7、通用命令
keys * (获取所有key)、
dbsize(获取数据库大小)、
exists key(判断当前key是否存在)
del key[key] (删除key)
expire key seconds(设置过期时间)
type key (判断类型)
ttl key(查询剩余过期时间)
persist key (去除过期时间)
scan循环遍历
flushall 清除所有key value
8、名词:
往返延迟:①客户端向服务器发送指令;②服务端接收指令,存储到执行队列;③服务器开始执行指令;④服务器返回执行结果;整个系列中的总耗时称之为往返延迟。
二、数据类型
1、String
key key1 value val{类型可以是:字符、数字(整数、浮点数)、bits、json、xml}
单个最大512MB。尽量控制在100kb
1、1:常用操作 i
ncr key :自增1; 如果key不存在增加后值为 1;
decr key :自减1: 如果key 不存在自减后为 -1;
incrby key k:key增加k;如果不存在增加后为k;
decrby key k:key减去k:如果不存在自减后为-k;
setnx key value :当key不存在时进行新增;成功返回1,失败返回0
set key value xx :当key存在时进行重新赋值,类似更新操作
mset key1 value1 key2 value2 key3 value3 : 批量设置值
mget key1 key2 key3 : 批量取值
getset key:先返回原有值;在进行更新值
append :追加操作,如果键不存在会先增加后返回
strlen :获取字符串长度(注意中文两个字节)
incrbyfloat:增加对应key浮点数
getrange:获取指定字符串下标的值
setrange:设置指定字符串下标的值,类似替换操作
[总结]
①:Redis内部编码
int:用于长度小于64位有符号整数表示的字符串<数字类型的字符串>
embstr: 用于长度小于等于44字节的字符串;这种类型的编码在内存使用和性能方面更有效率
raw:用于长度大于44字节的字符
②:字符串可以存储普通的字符、整数、浮点数;如果存入的value 可以被转换为整数或浮点数,则可以使用incr、decr、incrby、decrby;如果对字符进行增减,则会返回错误异常,如果值为空则当做0处理。
③:getrange key start end 当范围值strlen key超出当前长度,则直接返回字符末端。
④:setrange key index value 当在指定index上对应一个长度value则只修改指定index,如果value长度不为1则覆盖其指定位置后其它value,超出部分会直接替换进去。
2、hash 哈希
2.1、常用操作
hget key field : 获取 键map中指定字段的属性值
hset key field value: 设置 键map中指定字段的属性值;当map中的field已存在时使用重复field可覆盖value
hdel key field : 删除 键map中指定字段的属性值
hgetall key : 获取key哈希表所有属性包含:字段名、字段属性值<注意不要滥用:redis是单线程>
hkeys key : 获取key中所有字段名称
hvals key : 获取key中所有值
hexists key field : 判断指定列表中某个字段是否存在
hlen:计算指定key哈希的长度;注意返回字段属性长度
hmset key1 field1 value1 field2 value2 field3 value3:批量设置值
hmget key1 field1 field2 :批量取值
hsetnx key value :当key不存在时进行新增;成功返回1,失败返回0
hset key value xx :当key存在时进行重新赋值,类似更新操作
hincrby 自增
hincrbyfloat 浮点数增加
3、list列表
3、1:常用操作
’rpush keylist value1 value2 value3 : 从当前列表的value右侧开始插入数据 ===>>>value1、value2、value3
lpush keylist value1 value2 vlaue3 : 从当前列表的value左侧开始插入数据 ===>>>value3、value2、value1
linsert keylist befor|after value newValue :在当前列表value值之前插入还是之后插入数据
lpop keylist : 从左边删除一个元素
rpop keylist : 从右边删除一个元素
lrem keylist 0|1|-1 value: 删除列表中值等与value的相同元素;0 所有;1从左到右;-1从右到左
ltrim keylist start end : 列表修剪,只保留当前keylist中start到end之间的元素,其中start与end会被保留
lrande keylist start end : 获取列表从右到左指定范围内的值,包含start与end对应坐标值会返回
lindex keylist index : 获取指定下标的值
llen keylist : 获取列表长度
lset keylist index newValue: 更新指定下标值
备注:0~ -1 范围内返回的是整个列表。
4、set无序集合
特点:集合不允许重复,集合内元素无序,支持集合间操作(交集、并集、差集)
集合排序分值相等会按照名称进行排序;key不可以重复,value 可以重复(重复后会替换原有值)
4、1:常用操作 sadd key element(多个元素):增加元素
srem key element :删除元素
scard key: 计算集合元素个数
sismember key: 判断值是否存在
srandmember key: 从集合中随机取出一个或多个元素;参数:[count] 当count为正数随机返回元素不会重复;当count为负数时随机返回元素可能会出现重复值
smembers key: 取出集合所有元素
spop key:从集合中随机移除一个元素,并返回被移除的元素
smove key1 key2: 如果key1中存在element那么从key1中移除element,并将element添加至key2中成功返回1;失败返回0
4、2:集合间操作 sinter key1 [key2,key3...]: 求交集;返回同时存在第一个集合,而又存在于其它集合中的元素。
sinterstore desc_key1 key1[key2,key3...]: 求交集;将同时存在所有集合中的元素,存储到desc_key1集合中。
sdiff :求差集
sdiffstore desc_key1 key1[key2,key3...]: 求差集;将只存key而不存在其它集合中的元素,存储到desc_key1集合中。
sunion :求并集
sunionstore desc_key1 key1[key2,key3...]: 求并集;将至少存在一个元素中的值,存储到desc_key1集合中。(不含重复值)
5、sorted set有序集合
特点:不允许重复,集合内元素有序。存在分值排序。形式 key score element;集合排序分值相等会按照名称进行排序;
key不可以重复,value 可以重复(重复后会替换原有值)
5、1:常用操作
zadd key score element: 增加元素score 可以重复
zrem key element :从指定集合中移除指定元素,并返回移除个数。
zscore key element:获取指定集合中元素的分数
zincerby key increscore element:自增,自减分值
zcard key :返回集合元素个数
zrank key element: 获取元素排名;排名规则是根据分支score 从小到大--->>>0-100排序规则。
zrange key start end :获取指定范围内排名的值:指定范围内排序规则是升序。从低到高
zrangebyscore key minScore maxScore 获取指定分数内的元素值,从低到高
zcount key minScore MAxScore 获取指定分数内的元素个数
zremrangebyrank key start end :移除指定集合中排名介于start至end之间的所有成员 zremrangebyrankkey 0 -4<减去第四个>
zremrangebyscore key minScore maxScore : 移除指定集合中分数介于minScore至maxScore之间的所有成员
5、2:其它操作
zrevrank key element: 获取指定集合key中指定元素element的排名;排名从高到低
zrevrange key start end :获取指定范围内排名的值:指定范围内排序规则是升序。从高到低
zrevrangebyscore key minScore maxScore 获取指定分数内的元素值,从高到低
zinsterstore desc_key1 key1[key2,key3] :对指定集合进行交集运算,key返回一个新的集合
zunionstore desc_key1 key1[key2,key3] :对指定集合进行并集运算,key返回一个新的集合
6、HyperLogLog 唯一计数
特点:当数据量达到千万等级别的时使用HyoerLogLog所消耗的内存较小
6、1:常用操作 pfadd key value: 增加元素
pfcount key : 获取key 去重复值统计
pfmerge newKey key1 key2 :合并两个key 产生汇总集合。
6、2:其它操作
7、geo 地理位置
特点:存储基于地理信息坐标的集合
7、1:常用操作
e maxScore 获取指定分数内的元素值,从高到低
zunionstore 有序集合合并
8、pipeline : 批量执行,可以一次性执行一批get/set 命令;pipeline只适用于单节点
conn.pipelined(true|false); true 使用事务执行;false不开启事务执行
示例:
public void updateTokenPipeline(Jedis conn, String token, String user, String item) {
long timestamp = System.currentTimeMillis() / 1000;
Pipeline pipe = conn.pipelined(false);
pipe.multi();
pipe.hset("login:", token, user);
pipe.zadd("recent:", timestamp, token);
if (item != null){
pipe.zadd("viewed:" + token, timestamp, item);
pipe.zremrangeByRank("viewed:" + token, 0, -26);
pipe.zincrby("viewed:", -1, item);
}
pipe.exec();
}
9、过期时间:
persist key:移除过期时间 ttl key //查看给定键距离过期还有多少秒 查询结果 -1 没有设置过期时间;-2 已经过期
expire "key" time:设置过期时间《单位:秒》
expireat key timestamp :将给定的键的过期时间设置为unix时间戳
pttl key: 查看给定键过期时间还有多少毫秒
pexpire key milliseconds :让给定键在指定的毫秒后过期
pexpireat key : 将一个毫秒级的unix时间戳设置为给定的过期时间
当键的值被:set、getset、*store在内的命令,键的过期时间会被清除。
当被一个重名的key,会冲掉过期时间。
10、排序sort
sort key [BY pattern]
[LIMIT offset count] //限制排序返回数量 offset开始下标 count返回数量
[GET pattern [GET pattern ...]]
[ASC|DESC] //ASC 默认升序 | desc 降序
[ALPHA] //费字符排序
[STORE destination] //按照权重排序
11、发布与订阅
subscribe channel [channel ...] 订阅给定的一个或多个频道
unsubscribe channel [channel ...] 退订一个或多个频道
publish channel message 向给定的一个频道发送消息
psubscribe pattern [pattern ...] 订阅与给定模式匹配的所有频道
punsubscribe pattern [pattern ...] 退订给定模式,如果执行时没有给定任何模式,那么退订所有模式
12、事务概念
redis的基本事务涉及到MULTI(开始)、EXEC(结束);还有WATCH、UNWATCH、DISCARD
执行流程:MULTI : 逐条操作;EXEC 结束;当redis接收到multi命令时会将之后的每一条操作都存放到队列中去;直到接收到exec结束;
开始执行每条操作;遇到错误全部回滚
三、持久化
1、快照(Snapshotting)
可以在某一时刻将所有数据全部写入硬盘
2、只追加文件(AOF)
只有当执行写入命令才进行磁盘写入。
0、RDB 快照
RDB持久化方式;redis在本地生成一份RDB二进制文件,当需要恢复数据,或持久化到数据库时,可使用RDB文件进行。
1.1、生成RDB文件的三种方式:
save: 在执行数据返回前首先保存至本地RDB文件中,然后进行结果返回。(同步执行),数据量较大容易造成单线程阻塞。执行策略,当本地已经存在RDB文件时,生成一份新的文件,之后替换旧的RDB文件。
bgsave: 执行完Redis操作直接返回,异步进行更新本地RDB文件。(异步执行),生成一个fork()子进程执行保存。
自动:定时进行更新本地RDB文件。需要满足下列条件之一后执行:
配置 seconds changes
save 900s 1条
save 300s 10条
save 60s 1000条
修改配置:
redis.conf
dbfilename dump.rdb 修改默认文件名
dir ./ 修改默认存储文件夹
stop-writes-on-bgsave-erroe yes
--------------------------------------------------------------未完待续,20190706