redis的使用

[TOC]

一、redis安装

windows:

    1)进入redis目录
    2)安装:redis-server --service-install redis.windows.conf
    3)重启:redis-server --service-start
             redis-server --service-stop
             redis-server --service-uninstall

    创建多个实例:
        redis-server --service-install –service-name redisService1 –port 10001
        redis-server --service-start –service-name redisService1
        redis-server --service-install –service-name redisService2 –port 10002
        redis-server --service-start –service-name redisService2
        redis-server --service-install –service-name redisService3 –port 10003
        redis-server --service-start –service-name redisService3

    http://keenwon.com/1275.html

    https://github.com/ServiceStack/redis-windows

    安全一:redis设置访问密码                 redis.windows.conf  -> requirepass 123456

    安全二:切勿使用默认6379,容易遭到攻击    redis.windows.conf  -> port 6666

    安全三:绑定本地ip和允许连接的客户端ip    redis.windows.conf  -> bind 192.168.0.106 127.0.0.1

    出现问题:redis server went away    说明redis服务器没有开启

linux:

二、redis介绍
Redis开源软件,是在linux下开发的,用c语言。
使用gcc编译安装。
Redis是Remote Dictionary Server(远程数据服务)的缩写
由意大利人 antirez(Salvatore Sanfilippo)  开发的一款 内存高速缓存数据库
该软件使用C语言编写,它的数据模型为 key-value
它支持丰富的数据结构,比如string(字符串)、list(列表)、set(集合)、sorted set(有序集合) 、hash(哈希散列表)
可持久化,保证了数据安全。
默认端口6379
相比较mysql,mysql是存在在硬盘上的。
三、redis基本语法

1、查看版本号:

    info
    从0 - 15共16个数据库
2、key操作
    exists key              测试指定key是否存在
    del key1 key2 ...       删除指定key
    type key                返回指定key的value类型
    keys pattern            返回匹配指定模式的所有key          (keys * 获取所有的key | keys n* 获取所有n开头的数据)
    rename oldkey newkey    改名字
    dbsize                  返回当前数据库的key数量
    expire key seconds      给key指定过期时间
    ttl key                 返回key的剩余过期秒数
    select db-index         选择数据库
    move key db-index       将key从当前数据库迁移到指定数据库
    flushdb                 删除当前数据库中所有key
    flushall                删除所有数据库中所有key
3、string操作
    string是redis最基本的类型,redis的string可以包含任何数据,包括jpg图片或者序列化的对象,单个value值最大上限是1G字节

    set key value                       设置key对应的值为string类型的value
    mset key1 value1 key2 value2 ...    一次设置多个key的值
    mget key1 key2 ...                  一次获取多个key的值
    incr key                            对key的值做加加操作,并且返回新的值             (注意:对没有设置的key进行incr、decr操作,就会创建这个key,并且+1或者-1)
    decr key                            对key的值做减减操作,并且返回新的值
    incrky key integer                  对key的值做加加操作,但是指定值,并且返回新的值
    decrby key integer                  对key的值做减减操作,但是指定值,并且返回新的值
    append key value                    给指定key的字符串值追加value
    substr key start end                返回截取过的key的字符串值
4、list操作
    list类型是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列
    上进上出:栈 (从上面放数据,再从上面拿数据,旧的数据沉在底下,新的数据浮在上面,那么最终拿出来的都是新数据,先进后出)
    上进下出:队列 (从上面放数据,再从下面拿数据,每次新的数据进去了,旧的数据出来了,那么最终拿出来的都是旧数据,先进先出)

    eg:
        获取最新的2个登录用户,使用队列方法如下:
        第一次插入    lpush userid => 11    list结果为:[11]
        第二次插入    lpush userid => 22    list结果为:[22, 11]
        第三次插入    lpush userid => 33    list结果为:[33, 22, 11]

        ltrim user 0 1

        lrange user 0 1

    lpush key string            在key对应list列表的头部添加字符串元素
    rpush key string            在key对应list列表的尾部添加字符串元素
    lpop key                    从list列表的头部弹出(或者删除)元素,并返回该元素
    rpop key                    从list列表的尾部弹出(或者删除)元素,并返回该元素
    llen key                    对应list的长度,key不存在返回0,如果key对应类型不是list返回错误
    lrange key start end        返回指定区间的元素,下表从0开始
    ltrim key start end         截取list,保留截取区间内元素
5、set操作
    set是string类型的无序集合,最大可包含2^32-1个元素
    set集合类型具有:添加、删除、取并集、交集、差集(通过这些操作可以很容易的实现sns中的好友推荐功能操作)

    sadd key value              添加一个string元素到key对应的set集合中,成功返回1,如果元素已在集合中则返回0,key对应的set不存在返回错误
    sren key value1 value2 ...  从key对应set中移除给定元素,成功返回1
    smove p1 p2 value           从p1对应set中移除member并添加到p2对应set中
    scard key                   返回set的元素个数
    sismember key value         判断member是否在set中
    sinter key1 key2 ...        返回所有指定key的交集
    sunion key1 key2 ...        返回所有指定key的并集
    sdiff  key1 key2 ...        返回所有指定key的差集(前者对后者的差集,结果只有前者的数据没有后者,反之亦然)
    smembers key                返回key对应set的所有元素,结果是无序的
6、sort set操作
    sort set是string类型的有序集合,是(list、set)两种类型的集中体现
    每个元素都会关联一个权,通过权/值可以有序的获取集合中的元素

    eg:
        回复量最高的前3个帖子  
            帖子回复量(score|权)        帖子id(value|值)
                100                         1
                200                         2
                300                         3
                ...                         ...
                
                zadd tieba 300  3 
                zadd tieba 400  4  
                zadd tieba 500  5  
                zadd tieba 200  2 
                zremrangebyrank tieba 0 0   进来一个就删除一个权值最低的,保证里面一共有三个(或者直接zrevrange tieba 0 2)

    zadd keyname score value                添加元素到集合,元素在集合中存在则更新对应score
    zrem keyname value                      删除指定元素,1表示成功,如果元素不存在返回0
    zincrby keyname incr value              按照incr幅度增加对应value的score值,返回score的值   (zincrby tieba 100000 1)
    zrank keyname value                     返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
    zrevrank keyname value                  返回指定元素在集合中的排名(下标),集合中元素是按score从大到小排序的
    zrange keyname start end                从集合中取指定区间的元素,返回的结果是按score正序的
    zrevrange keyname start end             从集合中取指定区间的元素,返回的结果是按score逆序的
    zcard keyname                           返回集合中元素个数
    zscore keyname value                    返回指定元素对应的score
    zremrangebyrank keyname min max         删除集合中排名在指定区间的元素(权值从小到大排序)
7、hash操作
    存储类似于mysql里的一条完整的记录,或者一个对象类的存储

    hset keyname k v                设置k为指定值,如果key不存在,则先创建
    hget keyname k                  获取指定的k
    hmget keyname k1 k2 ...         获取全部指定的k
    hmset keyname k1 v1 k2 v2 ...   同时设置多个值
    hincrby keyname k v             将指定的k加上给定值v
    hexists keyname k               测试指定的k是否存在
    hdel keyname k                  删除指定k
    hlen keyname                    返回指定的key数量
    hkeys keyname                   返回所有的k
    hvals keyname                   返回所有的v
    hgetall keyname                 返回所有的k和v
四、持久化功能
redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘一份,在服务器重启之后会自动把硬盘的数据恢复到内存中去,数据保存到硬盘的过程就是持久化

方法一: snap shotting(快照持久化)   主要做大的持久化
         该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘里,如果数据非常多(10-20G)就不适合频繁进行该持久化操作

        快照持久化备份文件:dump.rdb

        该方式备份机制(频率):redis.conf
            save 900 1        900秒内超过1个key被修改,发起快照保存
            save 300 10       300秒内超过10个key被修改,发起快照保存
            save 60  10000    60秒内超过10000个key被修改,发起快照保存
            三个备份频率需要同时存在,数据变化快的时候需要快速备份(保证数据安全),数据变化慢的时候需要缓慢备份(节省服务器资源)

方法二: append only(AOF持久化)   主要做精细持久化,和快照持久化组成合作关系,当redis启动后将收集dump.rdb、appendonly.aof两者的数据一起还原到内存中
         AOF持久化本质:把用户执行的每个写指定(添加、修改、删除)都备份到文件中,还原数据到内存中的时候就是执行具体写指令而已(比如把里面的记录的num = 1 都加起来)

        开启AOF持久化备份:redis.conf
            打开 -> appendonly yes
            重启 -> redis-server
            生成 -> appendonly.aof
            备注 -> AOF持久化开始后将自动清除redis所有数据

        开启之后需要restart redis,才能生效

redis持久化指令:
./redis-cli bgsave - 同步保存数据到磁盘(快照保存)
./redis-cli bgrewriteaof - 当日志文件过长是优化AOF日志文件存储
./redis-cli -h 127.0.0.1 -p 6379 bgsave - 手动发起快照

kill -9 7634   杀死7634这个进程
五、redis主从模式
1) mysql为了降低每个服务器负载,可以设置读写分离(读服务器、写服务器)
2) 为了降低每个redis的负载,可以多设置几个,并做主从模式,一个服务器负载 "写"(添加、修改、删除)数据,其他服务器负载 "读" 数据,主服务器数据会 "自动" 同步给从服务器 

配置文件redis.conf:
设置并成为192.168.40.148服务器的从服务器 [ slaveof masterip masterport | slaveof 192.168.40.148 6379 ],然后主服务器将自动同步数据到从服务器,无需过问

redis.conf:   slave-read-only yes         默认只读
六、安装php的redis扩展
windows:
    1)将 php_redis.dll 扩展放入 /php/ext/ 文件中
    2)php.ini    extension=php_redis.dll

linux:
七、php操作redis
在php中,redis就是一个功能类Redis,Redis类中有很多成员方法(名字基本和redis指令名字一样,参数也一样)

1) 实例化redis对象     $redis = new Redis();
2)连接redis服务       $redis->connect('127.0.0.1', '6379');
3)连接密码            $redis->auth('123456'); 
4)设置值              $redis->set('name', 'xiaoming');
5)取值                echo $redis->get('name');

更多成员方法:
    $redis->mset(array('one'=>11, 'two'=>22));
    $redis->get('one');

php中redis的可操作方法:
    利用反射 Reflection 实现获取 Redis类内部的方法
    php大部操作都是正向的,类、实例化对象、对象调用成员
    其实类可以反向操作,类、返货来感知类的成员、反方向感知方法是否是公开的/私有的/受保护的/最终的

    通过Redis类实例化一个反射类对象
    $redis = new ReflectionClass('Redis');

    通过对象获得Redis类的全部方法
    $redis->getMethods();
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容