如果转载,请注明博文来源:
www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有。望各位支持!
少年入门笔记,整理出来一起入坑!入门的视屏来自imooc的:http://www.imooc.com/learn/839
1 NOSQL概述
什么是noSQL
not only sql非关系型数据库为什么需要NoSQL
web2.0大规模动态网站的兴起high performance ,高并发读写,动态页面展示与交互,比如微博点赞评论等操作,实时统计在线人数排行榜等huge storage,海量数据的高效存储和访问,大型网站的用户登录系统high scalability && high availability,高可扩展性和高可用性主流NOSQL产品
redis,mongodb,couchdbNoSQL的特点
易扩展灵活数据模型大数据量,高性能高可用NoSQL数据库的四大分类
键值存储,redis
优势,快速查询劣势,存储数据缺少结构化列存储,hbase
优势,快速查询劣势,功能局限文档数据库,mongodb
优势,数据结构要求不严格劣势,查询性能并非特别高,缺少统一查询的语法图形数据库,infogate
优势,社交网络,利用图结构的相关算法劣势,需要对整个图做算法分析,不利于分布式方案
2 redis概述
C语言编写的高性能键值对数据,支持的键值数据类型:
字符串类型列表类型有序集合类型散列集合类型
Redis的应用场景:
缓存网站访问统计任务队列数据过期处理应用排行榜分布式集群架构中的session分离
3 redis安装和使用
3.1 redis安装
依赖环境
gcc-c++
1 环境准备#官网下载 redis
3.2.5版本
wget http:
//download.redis.io/releases/redis-4.0.1.tar.gz
#安装 C 编译环境
yum -y
install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel
gcc gcc-c++
2 安装
解压安装包后,进入文件目录编译,编译结束时,会提示 Hint: It's a good idea to run 'make test
' ,建议在安装前先测试预安装下,make test预安装后,遇到错误:You need tcl 8.5 or newer in order to run the Redis test ,缺失安装包tcl,所以需要先安装这个 安装包后再次运行 make test,正常后再进行redis安装。
详细步骤如下:
#解压二进制包
tar -zvxf /opt/redis-
3.2.
5
#进入到文件目录
cd redis-
3.2.
5
#编译
make
#测试安装(稍微耗费点时间)
make test
#可能会提醒需要安装最新版的tcl
#yum install tcl
#指定路径安装
make PREFIX=/usr/local/redis
install
安装结束后,进入到安装路径中,
[root@bogon bin]# ls -lh /usr/local/redis/bin/
total 22M
-rwxr-xr-x. 1 root root 2.4M Aug 13 18:40 redis-benchmark
-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-aof
-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-rdb
-rwxr-xr-x. 1 root root 2.5M Aug 13 18:40 redis-cli
lrwxrwxrwx. 1 root root 12 Aug 13 18:40 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-server
这几个指令用途分别是:
redis-benchmark
性能测试工具redis-check-aof
aof文件修复工具redis-check-rdb
rdb文件检查工具redis-cli
redis客户端redis-server
redis服务器启动命令redis-sentinel
3.2 配置文件修改
1 #拷贝conf文件到/
etc目录
2 cp /opt/redis/redis-
4.0.
1/redis.conf /etc/
redis.conf
3
4
5 #redis.conf 参数说明
6
7 ################################## NETWORK #####################################
8
9 #绑定的主机地址
10 bind
127.0.
0.1
11
12 #保护模式,是否允许 没有认证配置的主机或接口连接redis,默认是启动保护模式,则不允许这种情况
13 protected-
mode yes
14
15 #指定redis的监听端口,默认端口是6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字,嗯,你开发的,你说了算。
16 port
6379
17
18 # In high requests-per-second environments you need an high backlog
in order
19 # to avoid slow clients connections issues. Note that the Linux kernel
20 # will silently truncate it to the value of /proc/sys/net/core/
somaxconn so
21 #
make sure to raise both the value of somaxconn and tcp_max_syn_backlog
22 #
in order to get the desired effect.
23
24 tcp-backlog
511
25
26 #客户端链接多长时间后关闭链接,单位是秒,指定为0,则表示关闭该功能
27 timeout
0
28
29 # A reasonable value
for this option is
300 seconds,
which is the new
30 # Redis default starting with Redis
3.2.
1.
31 tcp-keepalive
300
32
33 ################################# GENERAL #####################################
34
35 #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
36 daemonize yes
37
38 # If you run Redis from upstart or systemd, Redis can interact with your
39 # supervision tree. Options:
40 # supervised no -
no supervision interaction
41 # supervised upstart -
signal upstart by putting Redis into SIGSTOP mode
42 # supervised systemd - signal systemd by writing READY=
1 to $NOTIFY_SOCKET
43 # supervised auto -
detect upstart or systemd method based on
44 # UPSTART_JOB or NOTIFY_SOCKET environment variables
45 # Note: these supervision methods only signal
"process is ready."
46 # They
do not enable continuous liveness pings back to your supervisor.
47 supervised no
48
3.3 服务启动与关闭
1 #服务端启动
2 [root@bogon redis-
4.0.
1]# cd /usr/local/redis/
3 [root@bogon redis]# ./bin/redis-server /etc/
redis.conf
4 74537:C
13 Aug
18:
53:
30.774 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5 74537:C
13 Aug
18:
53:
30.774 # Redis version=
4.0.
1, bits=
64, commit=
00000000, modified=
0, pid=
74537, just started
6 74537:C
13 Aug
18:
53:
30.774 # Configuration loaded
7 [root@bogon redis]#
ps axu |
grep redis
8 root
74538 0.6 0.2 145248 2168 ? Ssl
18:
53 0:
00 ./bin/redis-server
127.0.
0.1:
6379
9 root
74665 0.0 0.0 112648 968 pts/
4 S+
18:
53 0:
00 grep --color=
auto redis
10
11 #客户端启动
12 redis-cli [-h
127.0.
0.1] [-p
6379]
13 127.0.
0.1:
6379>
ping
14 PONG
15
16 #存储键值对
17 127.0.
0.1:
6379>
set name imooc
18 OK
19
20 #获取name对应的value
21 127.0.
0.1:
6379>
get name
22 "imooc"
23
24 #获取所有keys
25 127.0.
0.1:
6379> keys *
26 1)
"name"
27
28 #删除keys
29 127.0.
0.1:
6379>
del name
30 (integer)
1
31 127.0.
0.1:
6379>
get name
32 (nil)
33
34 #关闭服务端
35 redis-cli shutdow
4 redis-py的入门
redis有支持非常多种语言编写的客户端,可以从官网查看
https://redis.io/clients ,redis-py是redis官方网站首选的python客户端开发包,本人只会点点python,所以从这个入门。
redis-py的github地址:
https://github.com/andymccurdy/redis-py
5 redis数据类型
键值对种key的注意事项:
不要过长
最好不要超过1024个字节不仅消耗内存,也影响查找效率不要过短
比如设置为a,没有实际意义,可能会降低key的可读性统一命名规范
5.1字符串 string
string中的一个key对应一个value,values最长可达512Mb。
string常用命令:
赋值
set
key value取值
get
key取值后赋值
getset
key value数值增减
自增1
如果该key不存在,则创建该key,并赋值为0,0自增后为1,等同于增加 【key,1】键值对如果该key存在,则value自增加1incr
key自减1
如果该key不存在,则创建该key,并赋值为0,0自减后为-1,等同于增加 【key,-1】键值对如果该key存在,则value自减1decr
key自增指定值
如果该key不存在,则创建该key,并赋值为0,0自增numbers,等同于增加 【key,numbers】键值对如果该key存在,则value自增numbersincrby
key numbers自减指定值
如果该key不存在,则创建该key,并赋值为0,0自减numbers,等同于增加 【key,-numbers】键值对如果该key存在,则value自减numbersdecrby
key numbers删除
del
key扩展
value追加string内容append
key string
5.2 哈希 hash
hash可以存储多个键值对之间的映射,它就像是一个迷你型的redis。
赋值
hset
key field valuehmset
key field value [field value ... ]取值
hget
key fieldhmget
key field [field ...]hgetall key增加数字
hincrby
key field number删除
hdel
key fielddel
key自学命令
hexists
key fieldhlen
keyhkeys
keyhvals
key
5.3 字符串列表 list
lish的顺序是按照插入的顺序,可以在头部跟尾部插入数据,如果是在list的两头进行操作,那么效率是很高的,但是如果在list中,则会耗费一定时间。
list的类型:
arraylist使用数组方式
根据索引查询速度是非常快的但是新增跟删除操作涉及到位移操作,则会比较慢linkedlist使用双向链接方式
每个元素都记录了前后元素的指针,删除跟新增只需要修改前后指针,数据操作较快
list常用的命令:
两端添加
lpush
key value [value ...]rpush key value [value ...]查看列表
lrange
key start stop指定位置push
lset
key index value
列表中第几个位置插入value,注意位置从0开始 指定value插入值
linsert
key before|after pivot value在列表中,从左到右,第一个等于pivot这个值的前面或者后面,插入valuse两端弹出
lpop
key
删除列表最左边的valuerpop
key
删除列表最右边的valuerpoplpush
source distination
从source列表右边删除一个value,并把这个value存储进入distination列表中适用于消息发布过程中的备份操作获取列表元素个数
llen key
获取列表的长度扩展命令
lpushx key value
如果列表存在,则从左端插入push valuse进入列表中,否则返回0rpushx key value
如果列表存在,则从右端插入push valuse进入列表中,否则返回0lrem key count value
count>0,从列表的左端开始删除 值等于 value,一共删除count个count<0,从列表的右端开始删除 值等于 value,一共删除count个count=0,删除 整个列表中所有 值等于 value
5.4 字符串集合 set
和list类型不同的是,set集合中不允许出现重复的元素,set最大可以包含的元素是 4294967295 。注意,set中是没有顺序的。
用于维护用户对象的唯一性,以及处理数据对象之间的关联关系,可以进行并集交集差集运算。比如购买A产品的用户ID,放在一个set中,购买另外一个B产品的用户ID,放在另外一个set中,这样就很方便计算同时购买两个产品的用户等。
list常用指令:
添加删除元素
sadd key member [member ...]srem key member [member ...]del
key获取集合中的元素
smembers
key差集运算
sdiff
key1 [key ...]
求集合key1与其他集合的差集sdiffstore
destination key1 [key ...]
求集合key1与其他集合的差集,并把结果存储在destination集合中交集运算
sinter
key [key...]
求多个集合的交集sinterstore destination key [key...]
求多个集合的交集,并把结果存储在destination集合中并集运算
sunion key [key...]
求多个集合的并集sunionstore
destination key [key...]
求多个集合的并集,并把结果存储在destination集合中扩展命令
sismember
key member
查看member在key中是否存在srandmember
key [count]
集合key中随机放回 count 个元素scard
key
查看集合个数
5.5 有序字符串集合 sorted set
sorted set跟set是比较类似的,集合中不允许出现重复的元素,那么有啥区别呢?sorted set有顺序,从小到大排序,更新操作非常快,访问数据也非常高效。
应用场景:游戏排名、微博热点
常用命令:
获得元素
zscore
key member
获取有序集合中的某个元素的score值zrange
key start stop [withscores]zrangebyscore
key mim max [withscores] [limit offset count]添加元素
zadd
key score member [score member ...]删除元素
zrem
key member [member...]zremrangebyscore
key min max 扩展查询
zincrby
key increment memberzscore
key memberzcount
key min max
6 keys的通用操作
keys *
查看所有keysdel
key [key...]
删除多个keyexists
key
判断某个key是否存在,存在返回1,不存在返回0rename
key newkey
重命名某个keyexpire
key seconds
设置某个key的生命期,过了这个时间就是过期数据ttl
key
查看该key的生命还剩下多少秒type
key
查看key的类型
7 redis的特性
7.1 多数据库
redis最多支持16个数据,下标0-15表示第几个数据库。默认是在0号数据。切换数据库可以通过select dbnumber 来切换,也可以通过move 来移动key从当前数据到指定的数据库。
7.2 事务
事务的指令:multi、exec、discard。redis中,如果某个命令执行失败,后面的命令还会继续执行。multi,开启事务,这个指令后的指令默认为在同一个事务内,exec等同于提交,discard等同于回滚。
8 redis的持久化
redis的高性能是因为数据都在内存中,如果数据库重启,则所有数据都会丢失,那么如何进行数据持久化呢?
RDB持久化
默认支持,在指定的时间内,把内存的数据写入磁盘AOF持久化
以日志的形式记录每一个操作,启动的时候,重新执行所有log无持久化
不进行持久化,则认为redis的作用为缓存,无需持久化数据RDB与AOF同时使用
8.1 RDB持久化
优势
redis数据库仅包含一个文件,对于文件备份是非常方便的,如果系统出现灾难时,较容易恢复灾难恢复时,备份文件较为容易单独转移到其他存储介质数据量很大的时候,启动速度快劣势
不能够保证数据无丢失,数据丢失时间 = 当前时间-最近备份时间子进程完成持久化工作,如果数据集很大的时候,可能会造成短时间内redis所在服务器停止对外服务配置
RDB默认配置文件中就有,可以查看redis.conf文件中关于save的设置
save 900 1 :900秒内至少有1个数据变化,则进行持久化
save 300 10 :300秒内至少有10个数据发生变化,则进行持久化save 60 10000 : 60秒内至少有1w个数据发生变化,则进行持久化
dbfilename 则是命名当前持久文件的名字dir,则是定义当前持久化文件的存放路径
8.2 AOF持久化
优势
更高的数据安全性
每秒同步,最高丢失1s数据每操作数同步,每次发生数据的变化都会立即记录到磁盘中,性能最低append追加文件备份
备份过程中出现问题,不会破坏之前的日志备份如果写入了一半数据,然后出现系奔溃的问题,在redis下一次启动之前,可以通过redis_check_aof工具解决数据一致性问题如果日志备份过大
redis会自动启动日志重写机制,append过程中,会把备份数据写入到老的备份文件中,并且会用一个新文件,记录此期间的修改数据语句AOF包含一个格式清晰的数据修改操作语句的日志文件劣势
相同数量的数据集文件,比RDB的要打AOF效率低于RDB需要人员配置,非默认配置配置
在redis.conf文件中,配置一下内容
appendonly yes:启动appendonly,开启AOF备份appendfilename "appendonly.aof" :AOF备份的文件名appendfsync always :每个修改操作同步备份一次appendfsync everysec:1s同步备份一次appendfsync no :不同步测试配置
简单测试案例
redis中配置AOF,选择每操作一次就备份的机制,增删改数据后,执行flushall,然后通过备份文件来恢复数据到flushall之前步骤
启动AOF,选择每操作一次就备份
appendonly yesappendfsync always重启redis
/usr/local/redis/bin/redis-cli shutdown/usr/local/redis/bin/redis-server /etc/redis.conf造数据
执行flushall
处理备份文件
vim /usr/local/redis/appendonly.aof删除flushall的操作记录
重启数据库
/usr/local/redis/bin/redis-cli shutdown/usr/local/redis/bin/redis-server /etc/redis.conf检查数据
转载于:https://www.cnblogs.com/xinysu/p/7366142.html
相关资源:JAVA上百实例源码以及开源项目