1:redis简介


  Redis是一种面向“键/值”对数据类型的内存数据库,可以满足我们对海量数据的读写需求


    redis的键只能是string类型


    redis的值支持多种数据类型


        1:字符串:string


        2:哈希:hash


        3:字符串列表:list


        4:字符串集合:set(不重复,无序)


        5:有序集合:sorted set(不重复,有序)


  特点:


    高性能(Redis读的速度是11W次/s,写的速度是8.1W次/s)


    原子性(保证数据的准确性)


    持久存储(两种方式RDB/快照,AOF/日志)


    主从结构(master-slave,负载均衡,高可用)


    支持集群(3.0版本)


  应用:应用高并发和实时请求的场景


    新浪微博


    hash:关注列表,粉丝列表


    string:微博数,粉丝数(避免使用select count(*) from ...)


    sorted set:TopN,热门微博


还有github,stackoverflow等也用到了redis 


     http://www.redis.cn/topics/whos-using-redis.html


2:环境搭建


  首先安装c语言的编译环境(有的linux系统中可能已经有了c语言编译环境,直接执行make命令就可以)


    参考


     http://xueliang1yi.blog.163.com/blog/static/1145570162012102114635764/     



    yum -y install cpp     



    yum -y install binutils     



    yum -y install glibc     



    yum -y install glibc-kernheaders     



    yum -y install glibc-common     



    yum -y install glibc-devel     



    yum -y install gcc     



    yum -y install make



  如果上面的软件都安装了之后再执行make命令还报错,就需要在make命令后面加个选项了



      make MALLOC=libc 指定内存分配器,默认是使用jemalloc              


      http://www.phperz.com/article/14/1219/42002.html


3:redis安装部署(单机)


  redis官网: http://redis.io/下载redis压缩包


-3.0.0.tar.gz


  编译、安装


  make


  make install


  拷贝配置文件


cp redis/redis.conf /etc/(拷贝


 到这里只是为了方便以后使用)


  修改配置文件


     daemonize yes(后台运行) 


    logfile /usr/local/redis/log(日志文件,目录必须存在)


  启动


     redis-server /etc/redis.conf [--port 6379]:中括号里面的东西可以省略,系统默认就是这个。


  redis客户端


     redis-cli [-h 127.0.0.1] [-p 6379]


  关闭


     shutdown然后  exit/quit


4:redis的特性【多数据库】


  多数据库:


    每个数据库对外都是一个从0开始的递增数字命名,不支持自定义的


    redis默认支持16个数据库,可以通过配置文件修改


    redis默认选择的是0号数据库


    SELECT数字:可以切换数据库


    多个数据库之间并不是完全隔离的,flushall


    flushall:清空redis实例下的所有数据


    flushdb:清空当前数据库中的所有数据


5:redis基础命令


  获得符合规则的键名称


    keys表达式(?,*,\?)


  判断一个键是否存在


    exists key


  删除键


    del key


    del key1 key2


  活动键值的数据类型type


    返回值可能是五种类型( string,hash,list,set,zset )


  注意:redis的命令不区分大小写


  redis的help命令


     "help <command>" for help on <command>


6:redis数据类型之string


  字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。一个字符串类型的值存储的最大容量是1GB


  命令


    set/get(setnx)------设置/获取数据


    mset/mget------一次设置/获取多个数据


    incr/decr/incrby/decrby/incrbyfloat------递增/递减


    append------追加vlaue值


    strlen------查看值的长度


7:redis数据类型之hash


  hsah类型的值存储了字段和字段值的映射,字段和字段值只能是字符串,不支持其他类型。hash类型的键至多可以存储2^32-1个字段


  hash类型适合存储对象


    redis可以为任何键增减字段而不影响其他键


  命令


    hset/hget/hmset/hmget/hgetall(hsetnx)


    hexists------判断键中的属性是否存在


    hincrby(hash类型中只有hincrby命令)


    hdel


    hkeys/hvals------获取键/值


    hlen(获取键中包含多少个字段)


8:redis数据类型之list


  list是一个有序的字符串列表 ,列表内部实现是使用双向链表(linked  list)实现的


  list还可以作为队列使用


  一个列表类型的键最多容纳2^32-1个元素


  命令


    lpush/rpush/lpop/rpop


    llen/lrange(-1表示最后一个元素)


    lindex------查询指定角标数据


    lset------修改


    ltrim------截取,保留指定数据


    rpoplpush------将元素从一个列表转到另一个列表


9:redis数据类型之set


  set集合的元素都是不重复的,无序的,一个集合类型键可以存储至多2^32-1个元素


  set集合类型和list列表类型的相似之处




  命令


    sadd/smembers/srem/sismember


    sdiff(差集)/sinter(交集)/sunion(并集)


    sidffstore/sinterstore/sunionstore


    scard(获取集合长度)/spop(随机从集合取出并删除一个元素)


    srandmember key [count]


        如果count为整数,且小于集合基数,那么命令返回count个元素的数组,数组中的元素各不相同。如果count大于等于集合基数,那么命令返            


    回整个集合


        如果count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值


10:redis数据类型之sorted  set


  有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)。


  命令


zadd/zscore/zrange/zrevrange/


    zrangebyscore(默认是闭区间,可使用"("使用开区间) 


    zincrby/zcard/zcount(获取指定分数范围的元素个数) 


    zrem


  扩展:


    +inf(正无穷)  -inf(负无穷)


易错点


  set命令


    (如果key已经持有其他类型值,set就覆盖旧值,无视类型)


11:java操作redis


  使用jedis第三方jar包操作redis


  数据库连接方式


    单机连接方式


    单机连接池方式


    多机分布+连接池方式


12:redis中键的生存时间(expire)


  redis中可以使用expire,命令设置一个键的生存时间,到时间后redis会自动删除它。


    expire------设置生存时间(单位秒)


    ttl------查看键的剩余生存时间


    persist------取消生存时间


    expireat [key] unix 时间戳


  应用场景


    限时优惠活动


    网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)


    手机验证码


    限制网站访客访问频率  


13:redis的事物(transaction)


  redis中的事务是一组命令的集合,事务同命令一样都是redis的最小执行单元,一组事务中的命令要么都执行,要么都不执行。


  原理:先将属于一个事务的命令发送给redis进行缓存,最后再让redis依次执行这些命令。


  应用场景


    一组命令都执行或都不执行


    保证一组命令在执行的过程中没有其他,命令的插入


  命令


multi    事务开始 


    ..... 


    exec    事务结束,开始执行事务中的命令 


    discard    放弃事务


  错误处理


    语法错误:致命的错误,事务中的所有命令都不执行


    运行错误:不会影响事务中其他命令的执行


  Redis不支持回滚(roll back)


    正因为redis不支持回滚功能,才使得redis在事务上可以保持简洁和快速。


  java代码手工实现incr递增命令


  watch命令


    作用:监控一个或者多个键,当被监控值被修改后阻止之后的一个事务的执行。


    但是不能保证其它客户端不能修改这一键值,所以我们需要在事务执行中的命令。


  注意:执行完事务的exex命令,watch就会取消对所有键值的监控


  unwatch:取消监控


14:redis中数据的排序(sort)


  sort命令可以对列表类型,集合类型和有序集合类型进行排序


     sort key [desc] [limit offset count] 


    by 参考键(参考键可以是字符串类型或者是hash类型的某个字段,hash类型的格式为:键名->字段名) 


        如果参考键中不带*号则不排序 


        如果某个元素的参考键不存在,则默认参考键的值为0


  扩展get参数


    get参数的规则和by参数的规则一样


    get #------返回元素本身的值


  扩展store参数


    使用store参数可以把sort的排序结果保存到指定的列表中


  性能优化


    1:尽可能的减少待排序键中元素的数量


    2:使用limit参数中获取需要的数据


    3:如果排序的数据量很大,尽可能使用store参数将结果缓存。


 15:”发布/订阅“模式


    发布:publish


    订阅:subscribe


16:redis任务队列


  任务队列;使用lpush和rpop(brpop)可以实现普通任务队列。


  优先级队列:


     brpop key1 key2 key3 timeout 


17:redis管道(pipeline)


  redis中的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java客户端(jedis)中是可以使用的。