MyException - 我的异常网
当前位置:我的异常网» .NET相关 » Redis-入门札记-15min带你一览redis

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

www.MyException.Cn  网友分享于:2013-09-03  浏览:0次
Redis-入门笔记-15min带你一览redis
 


 
    如果转载,请注明博文来源: 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自增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
        • 检查数据
          •  

文章评论

我是如何打败拖延症的
我是如何打败拖延症的
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
一个程序员的时间管理
一个程序员的时间管理
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员的鄙视链
程序员的鄙视链
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
总结2014中国互联网十大段子
总结2014中国互联网十大段子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Java程序员必看电影
Java程序员必看电影
 程序员的样子
程序员的样子
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
鲜为人知的编程真相
鲜为人知的编程真相
代码女神横空出世
代码女神横空出世
中美印日四国程序员比较
中美印日四国程序员比较
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
编程语言是女人
编程语言是女人
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员必看的十大电影
程序员必看的十大电影
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员应该关注的一些事儿
程序员应该关注的一些事儿
10个调试和排错的小建议
10个调试和排错的小建议
程序员都该阅读的书
程序员都该阅读的书
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员和编码员之间的区别
程序员和编码员之间的区别
我的丈夫是个程序员
我的丈夫是个程序员
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有