Redis

P1: 相对于关系型数据库优势

关系型数据库劣势

  1. 关系型数据库,无法处理每秒上万次读写请求
  2. 关系型数据库,存储记录有限,横向最多几百,纵向最多百万
  3. 无法通过简单增加硬件提高系统性能
  4. 大多是收费的

NoSQL优势

  1. 高性能
  2. 灵活的数据模型
  3. 高可用,出现故障时可快速解决
  4. 低成本,对硬件要求稍低

劣势

  1. 无关系,数据之间没联系,会造成数据的冗余和大量修改
  2. 不支持标准的SQL,没有统一的标准
  3. 没有关系型数据库的约束,大多数也没有索引的概念
  4. 没有事务,不能依靠事务实现ACID
  5. 没有丰富的数据类型

P2:Redis的历史和简介

  1. ANSI C语言编写
  2. key-value:value有:String,Map,List,sets,Sorted sets等
  3. 作者:Salvatore Sanfilippo,来自意大利西西里岛
  4. 没有windows版本的redis,windows版本不是原作者发开的,在linux中性能发挥的最好

P3:Redis常见命令

服务端

  1. 启动命令:在redis-server.exe目录下 cmd:redis-server.exe redis.windows.conf
  2. listening socket 127.0.0.1:6379: bind: No error 解决办法
redis-cli.exeshutdownexitredis-server redis.windows.conf

客户端redis-cli:

  1. 查看状态,沟通命令:ping(返回pong为正常)
  2. 查看当前数据库中数据数目:dbsize
  3. 切换数据库:select (index)
  4. 删除当前库的数据:flushdb
  5. 退出:exit/quit

操作key的命令:

  1. 查找key:keys [pattern](可以使用通配符*/?)
    *最好不要用“keys *”:因为可能会消耗很多时间,又因为redis是单线程的,所以会影响其他人的操作 *
  2. 判断存在数量:exists [key]
  3. 设置key的存活时间:expire [key] [time](以秒为单位,不设置则为永久有效)
    (返回值为1为成功,其他情况为0)
  4. 查看key剩余生存时间:ttl [key] (返回值为-1 为永久有效,-2为key不存在)
  5. 查看key所存储的值是什么类型的:type [key]
  6. 删除key :del [key] (成功则返回1,若删除不存在的key则返回0)

Redis的物种数据类型

  1. 字符串类型String,存储任何形式的字符串,最大512MB
  2. 哈希类型Map
  3. 列表类型List
  4. 集合类型Set
  5. 有序集合类型zset(sorted set)

不同类型的数据的操作命令

String

set [key] [value] 新值会覆盖旧值
get [key]:nil代表返回值为空
incr [key]:对整形数字进行自增;若key不存在,则新建并赋值为1
decr[key]:incr的反操作
append [key] [value]:拼接字符串;若key不存在,则相当于进行set操作
strlen [key]:求字符串长度
getrange [key] [start] [end]:取子串;[start] [end]为起始到结束位置的下标;下标从零开始;从右往左为-1开始
setrange [key] [start] [value]:设置子串值;从start位置(包含start)开始修改
mset [key1 value1…key2 value2…….]:批量设置数据
mget [key1…key2…….]:批量获得值;依照key顺序显示value;

hash

hset [key] [filed] [value]:设置hash类型数据;若是建立新表并成功,则返回1。如果是覆盖filed则返回0
hget [key] [filed]:获得hash值;若为空返回nil
hmset [key] [filed1] [value1]….[filed2] [value2]…:批量设置
hmget [key] [filed1] [filed2]….:批量获得数据
hgetall [key]:获取一个hash中所有数据
hdel [key] [filed1] [filed2]:删除filed;返回值为删除的数量
hkeys [key]:获取所有的filed;
hvals:获取所有vals;
hexists [key] [filed]:检查filed是否存在,存在返回1,其余情况返回0;

list

从头部操作的命令以L开头,从尾部操作的命令为R开头
lpush [key] [value1] [value2]…:从左压入list中(入栈shi);返回值为value数量
rpush …….
lrange [key] [start] [stop]: 获取列表key中指定区间的元素;从0开始;0和-1 可得全部;
lindex [key] [position]:通过下标,获取列表中单个元素;
llen [key]:获得列表中元素数量,从1开始
lrem [key] [count] [value]:以value和列表中值去比,相同则删除;count 为正数,那么代表从头开始找到count个符合条件的成员删除。为负数则为反方向;
lset [key] [position] [value]:对指定下标值进行替换
linsert [key] [before/after] [positon-value] [value]:插入值到指定数据(position-value,不是下标)之前/之后;返回值为-1代表没找到position-value,返回值为0道标key不存在;其他未新list的元素数量

set

sadd [key] [member1] [member2]…. :添加成员,不能添加相同成员,返回当前集合元素总数
smembers [key]:显示全部成员
sismember [key] [member]:检查成员member是否存在于key中
scard [key]:检查集合中成员数量
srem [key] [member1] [member2]:删除成员
srandmember [key] ([count]):从集合中随机显示指定数量的成员,默认一个;count为正数时,没有重复的,负数时有重复的。
spop [key] [count]:随机获得指定数量的元素,并删除

zser

zadd [key] [score] [member]:添加名为key的有序集合,其中member的值为score;member唯一,score不唯一;score同值时以member字母顺序排序;score可以是整数也可以是浮点数;
zrange [key] [start] [stop] [withscores]:获得指定下标区段内的成员;下标0开始,0 -1为全部;不加“withscores”则不显示score;
zrevrange:与zrange顺序相反(从大到小);
zrem [key] [member1] [member2]…:删除zset中的成员;返回值为删除的数量
zcard [key]:获得zset中成员数量
zrangebyscore [key] [min] [max] [eithscores] [limit offset count]:获得score为大于等于min,小于等于max值中的成员;-inf/+inf为集合中最小值和最大值;使用(min和(max分别代表大于不等于min和小于不等于max;从小到大显示;
limit n m:为从下标n开始取m个元素;
zrevrangebyscore:与zrangebyscore排序相反。
zcount [key] [min] [max]:返回有序集合中sorce在min和max之间成员数量

P4:事务

有两条及以上redis命令能保证被执行

事务操作的命令

1.multi:标记一个事务开始
2.exec:执行所有事务块内命令,被打断则返回nil
3.discard:取消事务
4.watch:监视一个/多个key ,如果事务在执行之前被其他命令改动,那么事务将会被打断。
5.unwatch:取消对所有key的监视

事务的实现

1.正常执行事务
  1. multi:开启事务
  2. 写入具体事务中要执行的操作
  3. exec:执行
2.事务执行exec之前,入队的命令存在错误:语法错误/影响服务器工作的错误,会终止事务中所有命令执行exec
3.执行exec之后才会出现错误(如 非语法错误),是会提交的。只执行事务中正确的命令
4.主动放弃事务:discard
watch机制:安全机制(类似mysql中乐观锁)
  1. watch 获得监视的key的原来的值
  2. multi…->执行exec
  3. 再watch 监视的key有没发生改变
  4. 如果改变则放弃事务
redis为了追求性能,没有回滚

持久化

RDB方式

redis database(RDB)
定时将内存中数据集快照以二进制存储到磁盘中,只有一个文件dump.rdb.
可以保存最近一小时/一天/一个月的全部数据…. 其使用时的是另一个进程,不影响redis本身(大量数据会产生影响)

保存策略 (通过修改:redis.windows.conf文件的指定位置)
save [n] [m]:在n秒内至少有m个key被改变了(搜索 RDB snapshots)
dbfilename:RDB文件名设置(搜索 dbfilename)
dir:指定RDB文件存储位置 ./为默认的当前目录(搜索 dir)
缺陷

当不满足存储策略时,内存中数据丢了,就真丢了

优势

AOF

Append-only File 当接收到改写数据的命令时,把改命令记录.读取操作不记录,redis重启时重新执行存储文件中所有命令

appendonly:默认是no,开启为yes
appendfilename:文件名,默认appendonlu.aof
dir:存放目录 ./
appendfsync:向aof文件写命令数据的策略

always:每次执行写入都会执行同步,慢一些但是安全
everysec:每秒执行一次操作,介于速度与安全之间,是默认选项
no:不主动进行操作,交由操作系统来做,比较快但不是很安全

auto-aof-rewrite-min-size:允许重写aof文件的大小

待续:jedis

redis

P1: 相对于关系型数据库优势

关系型数据库劣势

  1. 关系型数据库,无法处理每秒上万次读写请求
  2. 关系型数据库,存储记录有限,横向最多几百,纵向最多百万
  3. 无法通过简单增加硬件提高系统性能
  4. 大多是收费的

NoSQL优势

  1. 高性能
  2. 灵活的数据模型
  3. 高可用,出现故障时可快速解决
  4. 低成本,对硬件要求稍低

劣势

  1. 无关系,数据之间没联系,会造成数据的冗余和大量修改
  2. 不支持标准的SQL,没有统一的标准
  3. 没有关系型数据库的约束,大多数也没有索引的概念
  4. 没有事务,不能依靠事务实现ACID
  5. 没有丰富的数据类型

P2:Redis的历史和简介

  1. ANSI C语言编写
  2. key-value:value有:String,Map,List,sets,Sorted sets等
  3. 作者:Salvatore Sanfilippo,来自意大利西西里岛
  4. 没有windows版本的redis,windows版本不是原作者发开的,在linux中性能发挥的最好

P3:Redis常见命令

服务端

  1. 启动命令:在redis-server.exe目录下 cmd:redis-server.exe redis.windows.conf
  2. listening socket 127.0.0.1:6379: bind: No error 解决办法
redis-cli.exeshutdownexitredis-server redis.windows.conf

客户端redis-cli:

  1. 查看状态,沟通命令:ping(返回pong为正常)
  2. 查看当前数据库中数据数目:dbsize
  3. 切换数据库:select (index)
  4. 删除当前库的数据:flushdb
  5. 退出:exit/quit

操作key的命令:

  1. 查找key:keys [pattern](可以使用通配符*/?)
    *最好不要用“keys *”:因为可能会消耗很多时间,又因为redis是单线程的,所以会影响其他人的操作 *
  2. 判断存在数量:exists [key]
  3. 设置key的存活时间:expire [key] [time](以秒为单位,不设置则为永久有效)
    (返回值为1为成功,其他情况为0)
  4. 查看key剩余生存时间:ttl [key] (返回值为-1 为永久有效,-2为key不存在)
  5. 查看key所存储的值是什么类型的:type [key]
  6. 删除key :del [key] (成功则返回1,若删除不存在的key则返回0)

Redis的物种数据类型

  1. 字符串类型String,存储任何形式的字符串,最大512MB
  2. 哈希类型Map
  3. 列表类型List
  4. 集合类型Set
  5. 有序集合类型zset(sorted set)

不同类型的数据的操作命令

String

set [key] [value] 新值会覆盖旧值
get [key]:nil代表返回值为空
incr [key]:对整形数字进行自增;若key不存在,则新建并赋值为1
decr[key]:incr的反操作
append [key] [value]:拼接字符串;若key不存在,则相当于进行set操作
strlen [key]:求字符串长度
getrange [key] [start] [end]:取子串;[start] [end]为起始到结束位置的下标;下标从零开始;从右往左为-1开始
setrange [key] [start] [value]:设置子串值;从start位置(包含start)开始修改
mset [key1 value1…key2 value2…….]:批量设置数据
mget [key1…key2…….]:批量获得值;依照key顺序显示value;

hash

hset [key] [filed] [value]:设置hash类型数据;若是建立新表并成功,则返回1。如果是覆盖filed则返回0
hget [key] [filed]:获得hash值;若为空返回nil
hmset [key] [filed1] [value1]….[filed2] [value2]…:批量设置
hmget [key] [filed1] [filed2]….:批量获得数据
hgetall [key]:获取一个hash中所有数据
hdel [key] [filed1] [filed2]:删除filed;返回值为删除的数量
hkeys [key]:获取所有的filed;
hvals:获取所有vals;
hexists [key] [filed]:检查filed是否存在,存在返回1,其余情况返回0;

list

从头部操作的命令以L开头,从尾部操作的命令为R开头
lpush [key] [value1] [value2]…:从左压入list中(入栈shi);返回值为value数量
rpush …….
lrange [key] [start] [stop]: 获取列表key中指定区间的元素;从0开始;0和-1 可得全部;
lindex [key] [position]:通过下标,获取列表中单个元素;
llen [key]:获得列表中元素数量,从1开始
lrem [key] [count] [value]:以value和列表中值去比,相同则删除;count 为正数,那么代表从头开始找到count个符合条件的成员删除。为负数则为反方向;
lset [key] [position] [value]:对指定下标值进行替换
linsert [key] [before/after] [positon-value] [value]:插入值到指定数据(position-value,不是下标)之前/之后;返回值为-1代表没找到position-value,返回值为0道标key不存在;其他未新list的元素数量

set

sadd [key] [member1] [member2]…. :添加成员,不能添加相同成员,返回当前集合元素总数
smembers [key]:显示全部成员
sismember [key] [member]:检查成员member是否存在于key中
scard [key]:检查集合中成员数量
srem [key] [member1] [member2]:删除成员
srandmember [key] ([count]):从集合中随机显示指定数量的成员,默认一个;count为正数时,没有重复的,负数时有重复的。
spop [key] [count]:随机获得指定数量的元素,并删除

zser

zadd [key] [score] [member]:添加名为key的有序集合,其中member的值为score;member唯一,score不唯一;score同值时以member字母顺序排序;score可以是整数也可以是浮点数;
zrange [key] [start] [stop] [withscores]:获得指定下标区段内的成员;下标0开始,0 -1为全部;不加“withscores”则不显示score;
zrevrange:与zrange顺序相反(从大到小);
zrem [key] [member1] [member2]…:删除zset中的成员;返回值为删除的数量
zcard [key]:获得zset中成员数量
zrangebyscore [key] [min] [max] [eithscores] [limit offset count]:获得score为大于等于min,小于等于max值中的成员;-inf/+inf为集合中最小值和最大值;使用(min和(max分别代表大于不等于min和小于不等于max;从小到大显示;
limit n m:为从下标n开始取m个元素;
zrevrangebyscore:与zrangebyscore排序相反。
zcount [key] [min] [max]:返回有序集合中sorce在min和max之间成员数量

P4:事务

有两条及以上redis命令能保证被执行

事务操作的命令

1.multi:标记一个事务开始
2.exec:执行所有事务块内命令,被打断则返回nil
3.discard:取消事务
4.watch:监视一个/多个key ,如果事务在执行之前被其他命令改动,那么事务将会被打断。
5.unwatch:取消对所有key的监视

事务的实现

1.正常执行事务
  1. multi:开启事务
  2. 写入具体事务中要执行的操作
  3. exec:执行
2.事务执行exec之前,入队的命令存在错误:语法错误/影响服务器工作的错误,会终止事务中所有命令执行exec
3.执行exec之后才会出现错误(如 非语法错误),是会提交的。只执行事务中正确的命令
4.主动放弃事务:discard
watch机制:安全机制(类似mysql中乐观锁)
  1. watch 获得监视的key的原来的值
  2. multi…->执行exec
  3. 再watch 监视的key有没发生改变
  4. 如果改变则放弃事务
redis为了追求性能,没有回滚

持久化

RDB方式

redis database(RDB)
定时将内存中数据集快照以二进制存储到磁盘中,只有一个文件dump.rdb.
可以保存最近一小时/一天/一个月的全部数据…. 其使用时的是另一个进程,不影响redis本身(大量数据会产生影响)

保存策略 (通过修改:redis.windows.conf文件的指定位置)
save [n] [m]:在n秒内至少有m个key被改变了(搜索 RDB snapshots)
dbfilename:RDB文件名设置(搜索 dbfilename)
dir:指定RDB文件存储位置 ./为默认的当前目录(搜索 dir)
缺陷

当不满足存储策略时,内存中数据丢了,就真丢了

优势

AOF

Append-only File 当接收到改写数据的命令时,把改命令记录.读取操作不记录,redis重启时重新执行存储文件中所有命令

appendonly:默认是no,开启为yes
appendfilename:文件名,默认appendonlu.aof
dir:存放目录 ./
appendfsync:向aof文件写命令数据的策略

always:每次执行写入都会执行同步,慢一些但是安全
everysec:每秒执行一次操作,介于速度与安全之间,是默认选项
no:不主动进行操作,交由操作系统来做,比较快但不是很安全

auto-aof-rewrite-min-size:允许重写aof文件的大小

待续:jedis

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值