P1: 相对于关系型数据库优势
关系型数据库劣势
- 关系型数据库,无法处理每秒上万次读写请求
- 关系型数据库,存储记录有限,横向最多几百,纵向最多百万
- 无法通过简单增加硬件提高系统性能
- 大多是收费的
NoSQL优势
- 高性能
- 灵活的数据模型
- 高可用,出现故障时可快速解决
- 低成本,对硬件要求稍低
劣势
- 无关系,数据之间没联系,会造成数据的冗余和大量修改
- 不支持标准的SQL,没有统一的标准
- 没有关系型数据库的约束,大多数也没有索引的概念
- 没有事务,不能依靠事务实现ACID
- 没有丰富的数据类型
P2:Redis的历史和简介
- ANSI C语言编写
- key-value:value有:String,Map,List,sets,Sorted sets等
- 作者:Salvatore Sanfilippo,来自意大利西西里岛
- 没有windows版本的redis,windows版本不是原作者发开的,在linux中性能发挥的最好
P3:Redis常见命令
服务端
- 启动命令:在redis-server.exe目录下 cmd:redis-server.exe redis.windows.conf
- listening socket 127.0.0.1:6379: bind: No error 解决办法
redis-cli.exeshutdownexitredis-server redis.windows.conf
客户端redis-cli:
- 查看状态,沟通命令:ping(返回pong为正常)
- 查看当前数据库中数据数目:dbsize
- 切换数据库:select (index)
- 删除当前库的数据:flushdb
- 退出:exit/quit
操作key的命令:
- 查找key:keys [pattern](可以使用通配符*/?)
*最好不要用“keys *”:因为可能会消耗很多时间,又因为redis是单线程的,所以会影响其他人的操作 * - 判断存在数量:exists [key]
- 设置key的存活时间:expire [key] [time](以秒为单位,不设置则为永久有效)
(返回值为1为成功,其他情况为0) - 查看key剩余生存时间:ttl [key] (返回值为-1 为永久有效,-2为key不存在)
- 查看key所存储的值是什么类型的:type [key]
- 删除key :del [key] (成功则返回1,若删除不存在的key则返回0)
Redis的物种数据类型
- 字符串类型String,存储任何形式的字符串,最大512MB
- 哈希类型Map
- 列表类型List
- 集合类型Set
- 有序集合类型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.正常执行事务
- multi:开启事务
- 写入具体事务中要执行的操作
- exec:执行
2.事务执行exec之前,入队的命令存在错误:语法错误/影响服务器工作的错误,会终止事务中所有命令执行exec
3.执行exec之后才会出现错误(如 非语法错误),是会提交的。只执行事务中正确的命令
4.主动放弃事务:discard
watch机制:安全机制(类似mysql中乐观锁)
- watch 获得监视的key的原来的值
- multi…->执行exec
- 再watch 监视的key有没发生改变
- 如果改变则放弃事务
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: 相对于关系型数据库优势
关系型数据库劣势
- 关系型数据库,无法处理每秒上万次读写请求
- 关系型数据库,存储记录有限,横向最多几百,纵向最多百万
- 无法通过简单增加硬件提高系统性能
- 大多是收费的
NoSQL优势
- 高性能
- 灵活的数据模型
- 高可用,出现故障时可快速解决
- 低成本,对硬件要求稍低
劣势
- 无关系,数据之间没联系,会造成数据的冗余和大量修改
- 不支持标准的SQL,没有统一的标准
- 没有关系型数据库的约束,大多数也没有索引的概念
- 没有事务,不能依靠事务实现ACID
- 没有丰富的数据类型
P2:Redis的历史和简介
- ANSI C语言编写
- key-value:value有:String,Map,List,sets,Sorted sets等
- 作者:Salvatore Sanfilippo,来自意大利西西里岛
- 没有windows版本的redis,windows版本不是原作者发开的,在linux中性能发挥的最好
P3:Redis常见命令
服务端
- 启动命令:在redis-server.exe目录下 cmd:redis-server.exe redis.windows.conf
- listening socket 127.0.0.1:6379: bind: No error 解决办法
redis-cli.exeshutdownexitredis-server redis.windows.conf
客户端redis-cli:
- 查看状态,沟通命令:ping(返回pong为正常)
- 查看当前数据库中数据数目:dbsize
- 切换数据库:select (index)
- 删除当前库的数据:flushdb
- 退出:exit/quit
操作key的命令:
- 查找key:keys [pattern](可以使用通配符*/?)
*最好不要用“keys *”:因为可能会消耗很多时间,又因为redis是单线程的,所以会影响其他人的操作 * - 判断存在数量:exists [key]
- 设置key的存活时间:expire [key] [time](以秒为单位,不设置则为永久有效)
(返回值为1为成功,其他情况为0) - 查看key剩余生存时间:ttl [key] (返回值为-1 为永久有效,-2为key不存在)
- 查看key所存储的值是什么类型的:type [key]
- 删除key :del [key] (成功则返回1,若删除不存在的key则返回0)
Redis的物种数据类型
- 字符串类型String,存储任何形式的字符串,最大512MB
- 哈希类型Map
- 列表类型List
- 集合类型Set
- 有序集合类型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.正常执行事务
- multi:开启事务
- 写入具体事务中要执行的操作
- exec:执行
2.事务执行exec之前,入队的命令存在错误:语法错误/影响服务器工作的错误,会终止事务中所有命令执行exec
3.执行exec之后才会出现错误(如 非语法错误),是会提交的。只执行事务中正确的命令
4.主动放弃事务:discard
watch机制:安全机制(类似mysql中乐观锁)
- watch 获得监视的key的原来的值
- multi…->执行exec
- 再watch 监视的key有没发生改变
- 如果改变则放弃事务
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:不主动进行操作,交由操作系统来做,比较快但不是很安全