Redis分享

yunxunmi 9年前

一、redis简介

    Redis是一个开源的使用C语言编写的可基于内存亦可持久化的高性能日志型、key-value数据库,redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。云寻觅性能测试结果:

SET操作每秒钟 110000 次,GET操作每秒钟 81000 次。

1.常用程序命令
   启动:user00@JYKG_999:/data/app/redis/bin> ./redis-server ../redis.conf &(一定要跟后面的配置文件,不然redis会默认按照原始配置去启动。)
    停止:user00@JYKG_999:/data/app/redis/bin> ./redis-cli shutdown(这个命令其实跟ctrl-c差不多,比较暴力。使用前一定要使用bgsave命令将内存中的数据落地完成后在shutdown,不然会造成内存数据丢失)
    落地:user00@JYKG_999:/data/app/redis/bin> ./redis-cliredis 127.0.0.1:6379> bgsave

   bgsave命令执行后会在后台执行,因此查询bgsave的进度可以使用ps查询redis的进程数,默认启动redis-server的时候只有一个进程,bgsave的时候会加一个,当最终变成一个进程的时候代表bgsave完毕,也可以使用下面的info命令进行查询。
进程信息查询:redis 127.0.0.1:6379> info

2.配置文件redis.conf
   daemonize:默认值为no,即不再后台运行,改为yes即为后台运行
   pidfile:指定reidspid文件名称和路劲。
   port::进程开启的端口号
   timeout:设置客户端的超时间,默认为0(即关闭)
   loglevel:日志输出的级别,debugverbosenoticewarning。依次递减,运营环境使用verbose,生产环境使用notice
   databases:设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0
   save:进行落地备份的判断,即在多少秒内发生多少个key变化是进行备份。例如save 600 10000
   rdbcompression:在进行镜像备份时,是否进行压缩 
   dbfilename:镜像备份文件的文件名
   dir:备份文件的放置路劲
   slaveof:定义该机为salve.配置为salveof 1.1.1.1 6379则代表从1.1.1.1的6379端口同步redis数据。当配置好slave 后,slave master 建立连接,然后发送sync 命令。无论是第一次连接还是重新连接,master 都会启动一个后台进程,将数据库快照保存到文件中,同时master 主进程会开始收集新的写命令并缓存。后台进程完成写文件后,master 就发送文件给slaveslave将文件保存到硬盘上,再加载到内存中,接着master 就会把缓存的命令转发给slave,后续 master 将收到的写命令发送给slave 。如果master 同时收到多个slave 发来的同步连接命令,master 只会启动一个进程来写数据库镜像,然后发送给所有的slave 
    masterauth:当主数据库连接需要密码验证时,在这里指定 
    slave-serve-stale-data:当该salvemaster失去连接时进行的操作,当设置为yes,则该salve不断的去连接master直到连通。no则直接断开保存退出。
    maxclients:限制同时连接的客户数量。当连接数超过这个值时,redis将不再接收其他连接请求
    maxmemory:设置redis 能够使用的最大内存。当内存满了之后,如果还收到set请求,则删除最早的key来补充,适合于只做缓存。
    appendonly:是否开启aof备份,即实时追加信息到aof文件,是一种高效的数据库备份及灾难恢复方式。k歌的做法是master关闭该选项,在slave打开了该选项。
     appendfsync:设置对 appendonly.aof  文件进行同步的频率。always代表实时同步,everysec代表每秒同步一次。
     vm-enabled:是否开启虚拟内存支持。但是需要注意的是,redis中,所有的key 都会放在内存中,在内存不够时,只会把value 值放入交换区。这样保证了虽然使用虚拟内存,但性能基本不受影响.

二、数据类型

1.Keys

    Key属于字符串类型,不是binary safe的字符串,所以不允许使用空格和换行符。

2.value

string类型

    string是redis 最基本的类型,而且string 类型是二进制安全的。意思redis的string 可以包含任何数据。比如jpg 图片或者序列化的对象。从内部实现来看其实string 可以看作byte 数组,最大上限是1G 字节。下面是string 类型的定义。

list类型

    list是一个链表结构,每一个子元素都属于string类型的双向链表,即为队列或者栈。获取一个范围的所有值,对应的key可以理解为链表的名字。

    redis 提供五种数据类型:string,hash,list,set 及sorted set。

三.业务优化点

    1、键:尽量使用更短的键名,因为键名越长占用的空间越大,尤其与对用户相关的键名,每个用户节省一个字节就可以节省千千万万的内存

    2、值:如果业务上面可以使用整数就尽量不要用字符串,因为整数的存储空间比字符串节省很多,尤其对于小于1万的值,redis提前创建了对应的对象,不需要额外的存储。

    3、使用proxy建立与Redis-server的长连接,从而减少redis-server创建redis-client的消耗,节省服务器资源。

    4、在设计初期,尽量将业务数据分别部署到不同的redis实例中,初期由于数据量小,这些redis实例可以部署到一台机器上面,当业务量增大后,可以将redis实例迁移到其他机器,由于redis支持主从复制,因此迁移起来就非常方便了(摘自KM:【应用】Redis使用中值得注意的优化点)

四.附录

Redis 云寻觅网址 http://tieba.yunxunmi.com/