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

原文地址:https://www.cnblogs.com/axuduo/p/11142838.html