非关系型数据库NoSQL之Redis

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shadowcw/article/details/82682121

1-1NoSQL的简述

nosql非关系数据库(redis mongodb)
优点:
去掉了关系数据库的"关系特性" 易扩展有非常高的读写性能 尤其在大数据量下灵活的数据模型(无需提前简历字段)高可用
缺点:
没有统一的标准 层出不穷
四大分类:
一、键值对存储 =>redis
优势:查找速度比较快
劣势:存储数据缺少结构化
二、列存储
优势:查找速度比较快 扩展性强
劣势:功能比较局限性
三、文档数据库 =>MongoDB
优势:数据结构要求不严格
劣势:查询性能不是特别的高 
四、图形数据库 =>应用于社交网络的数据库
优势:图结构的算法
劣势:不容易分布式集群方案

2-1Redis概述

redis是用c语言开发的开源的高性能的键值对的数据库,通过提供多种键值数据类型来适应不同场景下的需求

redis支持的键值对的数据类型:字符串类型、列表类型、有序集合类型、散列类型、集合类型

redis应用场景:缓存(抢购、抢红包等高并发场景)、任务队列、应用排行榜、网站访问统

读取速度能到到11W/S  写8.1W/S

Jedis

jedis是redis官方首选的java客户端开发包

单链接模式和连接池模式

3-1Redis的数据结构之字符串

Redis中的数据类型

字符串(String),字符串列表(list),有序字符串集合(sorted set),哈希(hash),字符串集合(set)

其中String,hash比较常用

常用命令:

getset  先取值再设置值

incr  数值增加 

decr 数值减少

扩展命令 incrby num 5

decrby num 5

append 追加字符串

3-2Redis的数据结构之哈希

存储hash:类似于hashMap

hset hashname key value:向hashname中存储一个键值对key-value

hset hashname key1 value1 key2 value2...:一次向hashname中存储对个键值对

hget hashname key:获取hashname中key的值

hmget hashname key1 key2...:一次获取hashname中多个key的值

hgetall hashname:获取hashname中所有的key和value

hdel hashname key1 key2:删除hashname中key的值

del hashname:删除hashname

hincryby hashname key value:给hashname中的key的值加上value的值,同理key的值应为int数字类型

hexists hashname key:判断hashname中是否有key,存在返回1,不存在返回0

hlen hashname:返回hashname中key的个数

hkeys hashname:返回hashname中的所有key

hvals hashname:返回hashname中所有的value

3-3Redis的数据结构之List

存储list:

ArrayList使用数组方式

LinkedList使用双向链接方式

双向链表中增加数据

双向链表中删除数据

存储list常用命令:

两端添加

lpush listname value1 value2 value3:如果listname不存在则创建listname并从左侧添加,先添加的元素靠后,下标从0开始。如果listname存在则直接从左侧添加

rpush listname value1 value2 value3:从右侧添加,先添加的元素靠前,下标从0开始

查看列表

lrange listname start end:左边查看指定范围内的listname的元素,下标从0开始,如果end为-1代表是最后一个元素

两端弹出

lpop listname:左边弹出listname中的第一个元素。如果listname不存在元素则返回nil,一旦做了弹出操作,被弹出的元素将在listname中消失

rpop listname:尾部(右部)弹出,与lpop同理

获取列表元素个数

llen listname:获取listname中元素的个数,如果listname不存在则返回0

扩展命令

lpushx listname value1 value2...:如果listname存在则进行添加操作,如果listname不存在则添加失败返回0

rpushx listname value1 value2...:与lpushx同理

lrem listname count value:如果count大于0,则从左往右删除count个value;如果count小于0,则从右向左删除count个value;如果count等于0则表示删除所有的value

lset listname index value:将listname中下标为index的值修改为value

linsert listname before listvalue value:在listname中的listvalue前插入一个value

linsert listname after listvalue value:在listname中的listvalue之后插入一个value

rpoplpush listname1 listname2:将listname1中右边的第一个元素进行弹出然后向listname2的左侧进行添加弹出的元素

3-4Redis的数据结构之Set

Redis数据结构(Set):List允许出现重复数据,Set不允许出现重复数据;Set最大元素数量是4294967295
命令:
  (1)存:sadd 列名 [值...]
  (2)删:srem 列名 [值...]
  (3)查全:smembers 列名
  (4)查是否存在:sismember 列名 值,1表示存在,0表示不存在
  (5)差集:sdiff 列名1 列名2 (与顺序有关)
  (6)交集:sinter 列名1 列名2
  (7)并集:sunion 列名1 列名2
  (8)查数量:scard 列名
  (9)随机查:srandmember 列名
  (10)将差集存到新集合中:sdiffstore 新列名 列名1 列名2
  (11)将交集存到新集合中:sinterstore 新列名 列名1 列名2
  (12)将并集存到新集合中:sunionstore 新列名 列名1 列名2

3-5Redis的数据结构之Sorted Set

Redis数据结构(Sort-set):可存储有序但不重复的数据,根据分数指定存储顺序
命令:
  (1)存:zadd 列名 [分数 值]...
  (2)查分数:zscore 列名 值
  (3)查数量:zcard 列名
  (4)单删:zrem 列名 值...;范围删除:zremrangebyrank 列名 [begin,end]
  (5)升序查值:zrange 列名 [begin,end] <withscores>(两者可为正负数,负数则从反方向开始计数,正数从0开始,负数从-1开始)(withscores带分数,可选项)
  (6)降序查值:zrevrange 列名 [begin,end] <withscores>(两者可为正负数,负数则从反方向开始计数,正数从0开始,负数从-1开始)(withscores带分数,可选项)
  (7)分数查值:zrangebyscore 列名 [begin,end] <withscores> 
  (8)分页查值:zrangebyscore 列名 [begin,end] <withscores limit [begin,end]>

4-1Redis的Keys通用操作

keys *:查询所有key

keys str? :查询以字符串str开头的key

del key1 key2 key3 ... :删除多个key

exists key:判断key是否存在,存在返回1不存在返回0

rename key newkey :对key进行重命名

expire  key times(秒) :设置过期的时间

ttl key:查看key所剩的时间,若没有设置,则返回-1

type key :获取指定key的类型

5-1Redis特性

Redis特性:
  (1)每个Redis实例有16个数据库,角标从0~15,默认为0,也可以通过select来选择数据库。比如:select 1,选择1号数据库
move用于移动数据库。比如:move myset 1,表示移动myset这个key到1号数据库。
  (2)开启事务会将任务放到queue中,当提交事务时逐个执行
命令:
  (1)切换数据库:select [0~15]
  (2)开启事务:multi
  (3)提交事务:exec
  (4)回滚事务:discard

6-1Redis的持久化概述

Redis持久化
数据从内存同步到硬盘

两种持久化方式:
RDB方式
AOF方式

持久化使用的方式:
1.RDB方式:
默认支持,在指定的时间间隔内,将内存中的数据集快照写入到磁盘
2.AOF方式:
日志的形式记录服务器处理的每一个操作,服务器启动之初,读取文件,重新构建数据库
3.无持久化
通过配置继用Redis持久化功能,Redis缓存机制
4.同时使用RDB和AOF

6-2Redis的RDB数据持久化方式

RDB
优势:
1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
2.压缩文件转移到其他介质上
3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
,避免服务器进程执行I/O操作,启动效率高

劣势:
1.无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
2.通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒

配置:
cd /usr/local/redis
vim redis.conf
默认:
save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
save 300 10 #每300秒至少10个key变化,往硬盘写一次
save 60 10000 #每60秒至少10000个key变化,写一次
dbfilename dump.rdb #数据的文件名
dir ./ #保存的路径,redis路径下

6-3Redis的AOF数据持久化方式

AOF
优势:
1.同步:
a.每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
b.每修改同步:同步持久化,每分钟发生的变化记录到磁盘中,效率低,安全
c.不同步
2.日志写入操作追加模式append
a.系统宕机,不影响存在的内容
b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性
3.如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全
4.格式清晰的日志文件,完成数据的重建

劣势:
1.对于相同数据文件,相比RDB,AOF文件较大
2.效率低

配置:
vim  redis.conf
默认:
appendonly no #AOF方式默认关闭  
appendfilename appendonly.aof #配置文件
#appendfsync always #每修改一次,同步到磁盘上
appendsync everysec 每秒同步到磁盘一次
#appensync no 不同步

实践打开AOF:
appendonly yes
appendfsync always

终端2:先断开redis
./bin/redis-cli
shutdown
启动redis:
./bin/redis-server ./redis.conf

终端1:set name 100
终端2:产生appendonly.aof文件
终端1:flushall 清空数据库
终端2:
./bin/redis-cli shutdown
vim appendonly.aof
删除flushall
./bin/redis-server ./redis.conf
./bin/redis-cli
keys *
数据还原

7-1中文乱码问题 

在启动redis数据库之前加上chcp 65001

在启动时用 redis-cli --raw

防止中文乱码

猜你喜欢

转载自blog.csdn.net/shadowcw/article/details/82682121
今日推荐