您的位置:首页 > 数据库 > Redis

Redis-入门笔记-15min带你一览redis

2017-08-17 22:08 513 查看
 

 
    如果转载,请注明博文来源: 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,couchdb

NoSQL的特点
易扩展
灵活数据模型
大数据量,高性能
高可用

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自增加1
incr key

自减1
如果该key不存在,则创建该key,并赋值为0,0自减后为-1,等同于增加 【key,-1】键值对
如果该key存在,则value自减1
decr key

自增指定值
如果该key不存在,则创建该key,并赋值为0,0自增numbers,等同于增加 【key,numbers】键值对
如果该key存在,则value自
d99e
增numbers
incrby key numbers

自减指定值
如果该key不存在,则创建该key,并赋值为0,0自减numbers,等同于增加 【key,-numbers】键值对
如果该key存在,则value自减numbers
decrby key numbers



删除
del key

扩展
value追加string内容
append key string



5.2 哈希 hash

    hash可以存储多个键值对之间的映射,它就像是一个迷你型的redis。

赋值
hset key field value

hmset key field value [field value ... ]



取值
hget key field
hmget key field [field ...]

hgetall key



增加数字
hincrby key field number



删除
hdel key field
del key



自学命令
hexists key field

hlen key

hkeys key

hvals 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
删除列表最左边的value

rpop key
删除列表最右边的value

rpoplpush source distination
从source列表右边删除一个value,并把这个value存储进入distination列表中
适用于消息发布过程中的备份操作



获取列表元素个数
llen key
获取列表的长度

扩展命令
lpushx key value
如果列表存在,则从左端插入push valuse进入列表中,否则返回0

rpushx key value
如果列表存在,则从右端插入push valuse进入列表中,否则返回0

lrem 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 member

zscore key member

zcount key min max



6 keys的通用操作

keys *
查看所有keys



del key [key...]
删除多个key

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

rename key newkey
重命名某个key

expire 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 yes
appendfsync 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

检查数据


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: