redis

作者: 陪你听风_ea30 | 来源:发表于2017-12-09 17:20 被阅读0次

    姓名:穆培婷

    学号:17101223414

    专业:软件工程

    本文转载自:http://blog.csdn.net/mengxianhua/article/details/8961713

    【嵌牛导读】:Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

    【嵌牛鼻子】:Redis  缓存  负载均衡

    【嵌牛提问】:redis是什么?redis有什么用?

    【嵌牛正文】:

    一、什么是redis?

    Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人 antirez(Salvatore Sanfilippo)开发的一款 内存高速缓存数据库,该软件使用C语言编写,它的数据模型为 key-value,它支持丰富的数据结构,比如 String list  hash   set  sorted set。,可持久化,保证了数据安全。

    1、为什么要用redis

    1) 是一款数据库产品,有数据存储功能;

    2) 可以高速读取数据(in-memory);

    3) 可以减轻数据库负担

    4) 有集合计算功能(优于普通数据库合同类别产品)

    5) 多种数据结构支持

    2、什么场合适合使用redis?

    1)【sort set】排行榜应用,取top n操作,列入sina微博热门话题

    2)【list】获得最新N个数据或某个分类的最新数据

    3)计数器应用

    4)【set】sns(social network site)获得共同的好友

    5)【set】防攻击系统(IP判断)等等

    3、redis其他信息

    1) 作者是意大利的Salvatore Sanfilippo(antirez),又是VMWare大善人聘请了他专心写Redis

    2) 默认端口号 6379,是手机按键上的MERZ对应的号码,意大利歌女(Alessia Merz)梅尔兹的代名词

    4、拓展补充

    缓存:

    有两种类型 数据缓存、页面缓存(smarty)

    使用缓存减轻数据库的负载。

    在开发网站的时候如果有一些数据在短时间之内不会发生变化,而它们还要被频繁访问,为了提高用户的请求速度/降低网站的负载,就把这些数据放到一个读取速度更快的介质上,该行为就称作对该数据的缓存动作。

    该介质可以是文件、数据库、内存,内存经常用于数据缓存。

    页面缓存经常用在CMS内存管理系统里边

    数据缓存经常会用在页面的具体数据里边

    二、与memcached比较

    1) Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

    2) Redis支持master-slave(主—从)模式应用。

    3) Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

    4) Redis单个value的最大限制是1GB, memcached只能保存1MB的数据

    相关资源:Redis手册网址:http://www.redisdoc.com/en/latest/index.html

    三、Redis安装

    Windows下安装:redis-server.exe  redis.conf(或者redis-server.exe redis.windows.conf)

    客户端redis-cli.exe -h 127.0.0.1 -p 6379

    Linux下安装:redis-3.2.8.tar.gz

    tar zxvf redis-3.2.8.tar.gz

    cd redis-3.2.8

    make PREFIX=/usr/local/redis

    cd src

    启动服务:service redis start

    新开终端:cd /usr/local/redis

    客户端:./redis-cli

    四、具体使用

    1、Key

    Key 可以是任意类型,最后都存成byte[]

    Key 不能太长,比如1024字节,但作者也不追求太短,要表达清楚意思才好,作者建议用":"分隔表名,用"."作为单词间的连接。

    KEYS显示所有的key,支持通配符 "KEYS a*" , "keys a?c",但不建议在生产环境大数据量下使用。

    SORT,对集合按数字或字母顺序排序后返回,或者存到另一个List,还可以关联到外部Key等。因为会耗用CPU,有时会安排到slave上执行。

    EXPIRE/EXPREAT/PERSIST/TTL/,关于Key超时的操作,默认以秒为单位,也有p字头的以毫秒为单位的版本。

    其他命令: EXISTS,DEL,RENAME/RENAMENX(仅当new key不存在时),MOVE/MIGRATE(实例内从此db到彼db/从此实例到彼实例),RANDOMKEY,TYPE/Object(Key的类型/对象编码类型,空置时间),DUMP/RESTORE(value值的持久化)

    2、String

    最普通的key-value,除了支持最基本的get/set, Redis也很喜欢添加一些简便的指令,在服务端做起来是举手之劳,客户端便方便很多。

    incr/decr/incrby/incrbyfloat, 如果key还不存在时创建key并设原值为0。

    setEx/pSetEx, Set + Expire 的简便写法,p字头以毫秒为单位。

    setNx, key不存在时才put进去。

    getset, 设置新值,返回旧值。

    mget/mset/msetex, 一次get/set多个key。

    getbit/setbit/bitop/bitcount bitmap玩法,比如统计今天的访问用户,每个用户有一个offset,今天进来的话就把那个位为1。

    append/setrange/getrange,只对特定的数据格式比如字段定长的有用,json格式就没用。

    3、Hash

    Key-HashMap结构,相比2.2中的JSON格式Value,可以只读取/更新对象的某些属性,有些属性超长就让它一边呆着不动。。

    另一个用法是用来建索引。比如User对象,除了id有时还要按name来查询,可以建一个Key为user:index:name的Hash,在插入User对象时(set user:101 {"id":101,"name":"calvin"}), 顺便往这个hash插入一条(hset user:index:name calvin 101),这时calvin作为hash里的一个key,值为101。按name查询的时候,用hget user:index:name calvin 就能从名为calvin的key里取出id。

    4、List

    Redis里可以当双向链表来用,还提供blocking版本的pop函数,可以当Message Queue来用。

    不过List并没有JMS的ack机制,如果消费者把job给Pop走了又没处理完就死机了怎么办? 解决方法之一是加多一个sorted set,以分发时间为score,用户把job做完了之后要去消掉它。

    除了List标准的双向POP/PUSH外,还支持对队列内容的直接操作,比如LREM/LSET/LINSERT/LINDEX。

    另外经常用LTRIM限制List的大小,比如只保留最新的20条消息。LRANGE不同于POP直接弹走元素,只是返回列表内一段下标的元素。LLEN获取列表的长度。

    5、Set

    Set就是Set,还提供一些交集,并集,差集的集合操作。

    6、Sorted Set

    有序集,元素放入集合的时候要同时提供该元素的分数。

    ZRANGE/ZREVRANGE 按排名的上下限返回元素,正数与倒数。

    ZRANGEBYSCORE/ZREVRANGEBYSCORE 按分数的上下限返回元素,正数与倒数。

    ZREMRANGEBYRANK/ZREMRANGEBYSCORE 按排名/按分数删除元素。

    ZCOUNT 统计分数上下限之间的元素个数。

    ZRANK/ZREVRANK 显示某个元素的正倒序的排名。

    ZSCORE/ZINCRBY 显示元素的分数/增加元素的分数。

    ZADD/ZREM/ZCARD/ZINTERSTORE/ZUNIONSTORE 集合操作与SET相同,少了个差集的操作。

    7、事务

    用Multi/Exec/Discard实现, 隔离级别是这边事务一天不提交,那边另一个事务还是看到旧的值。 还有个Watch指令,起到CAS的效果,如果事务提交时,Key的值已被别的事务改变,事务会被打断。

    8、Lua Script

    Redis2.6内置的Lua Script支持,可以在Redis的Server端一次过运行大量逻辑。

    整个Script默认是在一个事务里的。

    Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key。

    EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值。然后用EVALHASH执行。

    内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串。

    五、Redis的主从模式

    前提:针对数据库的增删改查操作,在进行数据库的select操作是最耗费负载的,为了更好的优化mysql数据库,减轻mysql的负载,我们可以设置两台mysql数据库,一台主要负责数据的写入,一台负责数据的读取,这样相对可以减轻数据库的压力。同样这种方案也可以应用在redis中。设置主从redis.从服务器在连接到主服务器后,可以读取主服务器上的数据。

    注意:从服务器在连接主服务器后,自身是不可以进行写数据的操作,所以在进行自身操作的时候,必须要断开于主服务器的连接。(杀死操作,重新启动)

    相关文章

      网友评论

        本文标题:redis

        本文链接:https://www.haomeiwen.com/subject/crcpixtx.html