Redis高级运维必备

Redis知识点总结

01.Redis知识点一:redis特点以及安装使用

Redis特点介绍

REmote DIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key-value存储系统。Redis提供一些丰富的数据结构,包括lists,sets,ordered sets以及hashes,还有和Memcached一样的strings结构。Redis当然还包括了对这些数据结构的丰富操作。
1:数据结构丰富
2:持久化
3:支持简单事务
4:主从配置方便。

Redis可以用来做存储(storge)而menccathed是用来做缓存(cache)这个特点主要是因为其有持久化的功能。存储的数据有结构对于memcached来说,存储的数据,只有一种类型--字符串,而redis则可以存储字符串,链表,哈希结构,集合,有序集合。

Redis的下载安装

1.官方站点:redis.io 下载最新版或者最新stable版。
2.解压源码并进入目录
3.不用configure(redis本身自带coonfigure)
4.直接make(make是检查一下你缺少什么库,如果是32为机器 make为32bit)
注意碰到的问题:时间错误。.

02.Redis知识点二:redis通用key操作命令

通用键值操作

Redis对于key的操作命令:

01.keys pattern:查询想要的key

在redis里,允许模糊查询key
**:通配任意给字符,* *这里的代表0或者多个
?:通配单个字符

redis 127.0.0.1:6379> key *
1)"age"
2)"site"
redis 127.0.0.1:6379>keys site
1)"site"
redis 127.0.0.1:6379>keys s*
1)"site"
redis 127.0.0.1:6379>keys site*
1)"site"
02.del key1 key2.....keyn 作用:删除1个或多个键:返回值:不存在的key忽略掉,返回真正删除的key的数量
redis 127.0.0.1:6379>
03.randomkey:随机选则key
redis 127.0.0.1:6379> randomkey
"age"
redis 127.0.0.1:6379>randomkey
"site"
04.type key:返回key存储的值的类型,有string,link,set,order set,hash
redis 127.0.0.1:6379> type age
string
redis 127.0.0.1:6379>type site
string
05.exists key:判断key是否存在。返回1/0
redis 127.0.0.1:6379> exists age
(integer)1
redis 127.0.0.1:6379> exists site
(integer)1
06.del key1 key2....keyn 作用:删除1个或多个键 返回值:不存在的key 忽略掉,返回真正删除的key的数量。
redis 127.0.0.1:6379> del age
(integer)1
redis 127.0.0.1:6379> keys *
1)"site"
redis 127.0.0.1:6379>exists age
(integer)0
07.rename key newkey 作用:给key赋一个新的key名 注:如果newkey已存在,则newkey的原值被覆盖 如果新key不存在,这里就做改名的动作。如果已经存在就不改了,不然就和别的key发生冲突了。
redis 127.0.0.1:6379>rename site wangzhi
ok
redis 127.0.0.1:6379>exists site
(integer)0
redis 127.0.0.1:6379>keys *
1)"wangzhi"
redis 127.0.0.1:6379>get wangzhi
"www.zixue.it"
08.renamenx key newkey:作用:把key改名为newkey 返回:发生修改返回1 未发生修改返回0

如果search不存在,你则改成功。如果存在你就不改

redis 127.0.0.1:6379> set site www.zixue.it
OK
redis 127.0.0.1:6379> set search ww.so.com
OK
redis 127.0.0.1:6379> rename site sea
这里site改为了search,原本的search如何了?改了之后和原来的重名,原来的search就覆盖了
(integer)1
redis 127.0.0.1:6379> get sea
"www.zixue.it"
redis 127.0.0.1:6379> renamenx sea search
(integer)0
redis 127.0.0.1:6379> get search
"www.zixue.it"
redis 127.0.0.1:6379> keys *
1)"search"
2)"sea"
09.move key db:移动一个key redis是用来存储用的,它不仅仅是用来缓存用的。给我们设定了多个服务器。默认给我们开启了databases:16个数据库分别是从0到15,默认是从0号数据库中开始操作数据的。
root@localhost redis># vim redis.conf
redis 127.0.0.1:6379> keys *
1)"search"
2)"sea"
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> keys *
(empty list or set):没有一个key?
为什么?之前还有两个key,因为这里是来得了1号服务器。默认状态是走到0号服务器。
redis 127.0.0.1:6379[1]> select 0
OK
redis 127.0.0.1:6379> keys *
1)"search"
2)"sea"
将0号数据库的key移动到1号数据库里面
redis 127.0.0.1:6379>move sea 1
(integer)1
redis 127.0.0.1:6379>keys *
1)"search"
redis 127.0.0.1:6379>select 1
OK
redis 127.0.0.1:6379[1]>keys *
1)"sea"
redis 127.0.0.1:6379[1]>
在redis里面,默认是没有有效期的。为什么没有有效期?因为redis它需要做的是存储,而非缓存。但是如果就要当作缓存来用该如何?就要设一个有效期该如何
10.expire key 整型值 作用:设置key的声明周期一秒为单位
redis 127.0.0.1:6379[1]> select 0
OK
redis 127.0.0.1:6379>keys *
1)"search"
查看它还能活多久
redis 127.0.0.1:6379> ttl search
(interger) -1(-1代表永久有效,它不自动生效)
redis 127.0.0.1:6379>
11.ttl key:查询有效期 作用:查询key的生命周期 返回:秒数(以秒数为单位的生命) 注意:对于不存在的key或已过期的key。都返回-1 在Redis 2.8中,对于不存在的key返回-2
redis 127.0.0.1:6379> ttl search
(integer)-1
redis 127.0.0.1:6379> expire search 10
(integer)1
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
"www.so.com"
redis 127.0.0.1:6379> get search
(nil)  这里已经给它设置10秒了,它已经不存在了。

redis 127.0.0.1:6379> expire search 10
(integer)1
redis 127.0.0.1:6379> ttl search
(integer)7
redis 127.0.0.1:6379> ttl search
(integer)6
redis 127.0.0.1:6379> ttl search
(integer)5
redis 127.0.0.1:6379> ttl search
(integer)4
redis 127.0.0.1:6379> ttl search
(integer)3
redis 127.0.0.1:6379> ttl search
(integer)2
redis 127.0.0.1:6379> ttl search
(integer)1
redis 127.0.0.1:6379> ttl search
(integer)0
redis 127.0.0.1:6379> ttl search
(integer)-1
redis 127.0.0.1:6379> ttl search
(integer)-1
pexpire key 毫秒数,设置生命周期数 pttl key,以毫秒返回生命周期
redis 127.0.0.1:6379>set search www.zixue.it
OK
redis 127.0.0.1:6379>pexpire search 9000
(integer)1
redis 127.0.0.1:6379>pttl search
(integer)5207
redis 127.0.0.1:6379>pttl search
(integer)3343
redis 127.0.0.1:6379>pttl search
(integer)1853
redis 127.0.0.1:6379>pttl search
(integer)837
redis 127.0.0.1:6379>pttl search
(integer)-1
redis 127.0.0.1:6379>

把这个key设置为永久有效

redis 127.0.0.1:6379> set site www.zixue.it
OK
redis 127.0.0.1:6379> expire site 10 将它的生命周期设置为10秒
(integer)1
redis 127.0.0.1:6379> ttl site
(integer)7
redis 127.0.0.1:6379> ttl site
(integer)6
redis 127.0.0.1:6379> persist site  //把这个key设置为永久有效
(integer)1
redis 127.0.0.1:6379> ttl site
(integer)-1
redis 127.0.0.1:6379> get site
"www.zixue.it"  //这里就的set还存在
redis 127.0.0.1:6379>

03.Redis知识点三:string结构及命令详解

Redis字符串类型的操作

01.set key value[ex 生命周期 秒数]/[px 毫秒数][nx]/[xx] ex:可以让生命周期在设置之初就有一个生命周期
redis 127.0.0.1.6379> flushdb  窜穿一下db
OK
redis 127.0.0.1.6379> keys *
 (empty list or set)
redis 127.0.0.1.6379>set site www.zixue.it
OK
redis 127.0.0.1.6379> ttl search
(integer) -1
redis 127.0.0.1.6379> ttl search
(integer) -1
redis 127.0.0.1.6379>get search
(nil)
redis 127.0.0.1.6379> set search www.baidu.com ex 10px 1567
ok
redis 127.0.0.1.6379> get search
(nil)
redis 127.0.0.1.6379> set search www.baidu.com ex 10 px 6567
OK
redis 127.0.0.1.6379> get search
"www.baidu.com"
redis 127.0.0.1.6379> ttl search
    (integer)1
redis 127.0.0.1.6379> set search www.baidu.com ex 10 px 6567
OK
redis 127.0.0.1.6379> pttl search
(integer)2528
redis 127.0.0.1.6379> flushdb
OK
redis 127.0.0.1.6379> set site www.so.com
OK
redis 127.0.0.1.6379>set site www.baidu.com nx  //这里如果不加则直接改成什么数加nx  的意思是site不存在的时候再做子操作,要是存在就不能发挥作用
(nil)
redis 127.0.0.1.6379> get site
"www.so.com"
redis 127.0.0.1.6379> set site www.google.com xx
OK
redis 127.0.0.1.6379> get site
"www.goole.com"
redis 127.0.0.1.6379>  set  abc www.google.com.xx
(nil)
02.mset multil set,一次性设置多个键值
mset multil set,一次性设置多个键值
例:mset key v1 key2 v2....
redis 127.0.0.1.6379>mset a aman bbold c comtroller d diamond
OK
redis 127.0.0.1.6379>keys *
1)"a"
2)"d"
3)"b"
4)"c"
5)"site"
redis 127.0.0.1.6379> get a 
"aman"
redis 127.0.0.1.6379> get b 
"bold"
一次get多个键值
redis 127.0.0.1.6379> mget a b c
1) "aman"
2) "bold"
3) "comtroller"
redis 127.0.0.1.6379>
03.get key 作用 获取key的值
04.mget key1 key2 ...keyn 作用获取多个key的值
05.setrange key offset value 作用把字符串的offset偏移字节改成value 注意:如果偏移量> 字符长度,该字符自动补0x00
redis 127.0.0.1:6379> flushdb  //先清一下
OK
redis 127.0.0.1:6379>set word helllo
OK
redis 127.0.0.1:6379>get word
"hello"
redis 127.0.0.1:6379>setrange word 2 ??  //设置范围,从那里开始偏移
(integer)5
redis 127.0.0.1:6379>get word
"he??o"
redis 127.0.0.1:6379>set word hell
OK
redis 127.0.0.1:6379>setrange word 6 !
(integer)7
redis 127.0.0.1:6379>get word
"hello\x00!"
06.append key value 往字符串的尾巴处追加 作用:把value追加到key的原值上
redis 127.0.0.1:6379>append word @@
(integer)9
redis 127.0.0.1:6379>get word
"hello \x00!@@"
07.getrange key start stop: 获取他的一小部分的 作用:是获取字符串中[start,stop]范围的值 注意:对于字符串的下标,左数从0开始,右数从-1开始

注意:
1:start>=length,则返回空字符串
2:stop>=length,则截取至字符结尾
3:如果start 所处位置在stop右边,返回空字符串

redis 127.0.0.1:6379>set area chinese
OK
redis 127.0.0.1:6379>getrange area 1 4
"hine"
redis 127.0.0.1:6379>set statis working
OK
redis 127.0.0.1:6379>getrange status 0 -3
"worki"
redis 127.0.0.1:6379>getrange status 0 -4
"work"
redis 127.0.0.1:6379>getrange status 6 3
""
redis 127.0.0.1:6379>set status sleep
OK
redis 127.0.0.1:6379>getset status wakeup
"sleep"
redis 127.0.0.1:6379>get status
"wakeup"
redis 127.0.0.1:6379>getset status working
"wakeup"
redis 127.0.0.1:6379>set age 29
OK
redis 127.0.0.1:6379>get age 
"29"
redis 127.0.0.1:6379>incr age
(integer)30
redis 127.0.0.1:6379>decr age
(integer)29
redis 127.0.0.1:6379>set num 100000
OK
redis 127.0.0.1:6379>decr num
(integer) 99999
redis 127.0.0.1:6379>incrby age 5
(integer)34
redis 127.0.0.1:6379>incrby age 5
(integer)39
redis 127.0.0.1:6379>decrby age 10
(integer)29
08.incrby key number :
redis 127.0.0.1:6379>incrby age 90  (integer)92
把它当成一个浮点数来增加
09.incrbyfloat key floatnumber:
redis 127.0.0.1:6379>incrbyfloat age 3.5  "95.5"
redis 127.0.0.1:6379>incrbyfloat age 0.5
29.5
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
decr key  redis 127.0.0.1:6379>set age 20
decrby key number 
getbit key offset
10.setbit key offset value

设置offset对应二进值位上的值
返回:该位上的旧值
注意:
1:如果offset过大,则会在中间填充0.
2:offset最大大到多少,这里关联到value最多能有多长
在位上做操作
给定字母,可能是A-Z,但具体是谁,不知道,如何把他们变成小写

redis 127.0.0.1:6379>setbit char 2 1
(integer)0
redis 127.0.0.1:6379>get char
"a"
redis 127.0.0.1:6379>set char B
OK
redis 127.0.0.1:6379>setbit char 2 1
(integer)0
redis 127.0.0.1:6379>get char
"b"
小写变成大写,这里是从位的角度来做操作
redis 127.0.0.1:6379> setbit char 2 0
(integer)1
redis 127.0.0.1:6379>get char
"B"
这里最大能搞多少呢?调max offset N(N+1)/8个字节,最大的字符的值是多大?
redis 127.0.0.1:6379>setbit char 4394967296 1
(error)ERR bit offset is not an integer or out of range
redis 127.0.0.1:6379>setbit char 4394967295 1  最大值是2的32次方个字节减1除以8剩下2的29次方可以推算出最大的key值是512M
(integer)0
(1.72s)
11.bitop operation destkey key1[key2...]:让两个key来做相应的位上的AND操作 对于key1,key2,keyN作operation并将结果保存到destkey上. operation可以是AND|OR NOT XOR
redis 127.0.0.1:6379>flushdb
OK
redis 127.0.0.1:6379>setbit upper 2 1
(integer)0
redis 127.0.0.1:6379>get upper
" " 
redis 127.0.0.1:6379>setbit lower 2 1  谁和它或谁变成小写
(integer)0
redis 127.0.0.1:6379>set char Q
OK
redis 127.0.0.1:6379>  bitop or char char lower 让他们两者做位上的操作
(integer)1
redis 127.0.0.1:6379> get char
"q"

04.Redis知识点四:list结构及命令详解

link链表结构:若干元素各自是各自的独立成体系,这里有一个指针指向下一个元素的

01.Ipush key value:作用把值插入到链表头部
redis 127.0.0.1:6379>flushdb  清一下所有的数据
OK
redis 127.0.0.1:6379>keys *
(empty list or set) //没有数据
redis 127.0.0.1:6379>lpush character a
(integer)1
redis 127.0.0.1:6379>lpush character b
(integer)2
redis 127.0.0.1:6379>lpush character c
(integer)3
redis 127.0.0.1:6379>lrange character 1 2
1)"a"
2)"b"
redis 127.0.0.1:6379>lrange character 1 3
1)"a"
2)"b"
3)"c"
redis 127.0.0.1:6379>lrange character 0 3
1)"0"
2)"a"
3)"b"
4)"c"
不管这个链表有多少元素,则立即可以看到它所有元素
redis 127.0.0.1:6379>lrange character 0 -1
1)"0"
2)"a"
3)"b"
4)"c"
02.rpop key:作用:返回并删除链表尾元素
03.rpush lpop:
redis 127.0.0.1:6379>rpop character
"c"
redis 127.0.0.1:6379>lrange character 0 -1
1)a"
2)"b"
redis 127.0.0.1:6379>flushdb
OK
redis 127.0.0.1:6379>lpush answer a b c a b d a
(integer)7
redis 127.0.0.1:6379>lrange character 0 -1
1)"a"
2)"b"
3)"d"
4)"a"
5)"c"
6)"b"
7)"a"
在这里先删一个b,给的是整数就从头部往尾部删
redis 127.0.0.1:6379>lrem answer 1 b
(integer) 1
redis 127.0.0.1:6379>lrange anser 0 -1  再次查看所有内容
1)"a"
2)"d"
3)"a"
4)"c"
5)"b"
6)"a"
从尾部开始删2个a
redis 127.0.0.1:6379>lrem answer -2 a
(integer) 2
redis 127.0.0.1:6379> lrange answer 0 -1
1)"a"
2)"d"
3)"c"
4)"b"
redis 127.0.0.1:6379>flushdb
OK
redis 127.0.0.1:6379>rpush a b c d e f
(integer) 5
redis 127.0.0.1:6379>flushdb 
OK
redis 127.0.0.1:6379>rpush character a b c d e f
(integer)6
redis 127.0.0.1:6379>lrange character 0 -1
1)"a"
2)"b"
3)"c"
4)"d"
5)"e"
6)"f"
redis 127.0.0.1:6379>ltrim character 2 5
OK
redis 127.0.0.1:6379>lrange character 0 -1
1)"c"
2)"d"
3)"e"
4)"f"
redis 127.0.0.1:6379>ltrim character 1 -2
OK
redis 127.0.0.1:6379>lrange character 0 -1
1)"d"
2)"e"
redis 127.0.0.1:6379>lindex character 0
"d"
redis 127.0.0.1:6379>lindex character 1
"e"
redis 127.0.0.1:6379>lindex character 2
(nil)
redis 127.0.0.1:6379>llen  character
(integer)2
redis 127.0.0.1:6379> rpush b c d
(integer)2
redis 127.0.0.1:6379>llen  character
(integer)2
redis 127.0.0.1:6379>rpush character b c d
(integer)5
redis 127.0.0.1:6379>llen character
(integer)5
redis 127.0.0.1:6379> rpush num 1 3 6 8 9
(integer)5
redis 127.0.0.1:6379>linsert num before 3 2
(integer)6
redis 127.0.0.1:6379>lrange num 0 -1
1)"1"
2)"2"
3)"3"
4)"6"
5)"8"
6)"9"
redis 127.0.0.1:6379>
04.lrange key start stop:作用:返回链表中[start,stop]中的元素

规律:左数从0开始,右数从-1开始
lrem key count value
作用:从key链表中删除value值
注: 删除count的绝对值个value后介绍、Count>0 从表头删除 Count<0 从表尾删除
Itrim key start stop:作用:剪切key对应的链接,切[start,stop]一段,并把该段重新赋值给key
lindex key index 作用:返回index索引上的值。
(nil)

05.ream key count value 作用:从key链表中删除value值 注:删除count的绝对值个vaue后介绍Count>0 从表头删除 Count<0从表尾删除

06.ltrim key start stop :作用:剪切key对应的链接,切[start,stop]一段,并把该段重新赋给key

07.lindex key index 作用:返回lindex key 2

08.llen key 作用:计算链接表的元素个数

redis 127.0.0.1:6379>llen task
(integer)3
redis 127.0.0.1:6379>

09.linsert key after|before search value 作用:在链表中寻找‘search’,并在search值之前之后,插入value 注:一旦找到一个search 后,命令就结束了,因此不会插入多个value

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

10.rpoplpush source dest : 作用 :把sourse 的尾部拿出,放在dest的头部,并返回 该单元值

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

11.brpop ,blpop key timeout 作用:等待弹出key的尾/头元素,Timeout为等待超时时间 如果timeout为0,则一直等待

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
12.
redis 127.0.0.1:6379>flushdb  清一下所有的数据
OK
redis 127.0.0.1:6379>keys *
(empty list or set) //没有数据
redis 127.0.0.1:6379>lpush character a
(integer)1
redis 127.0.0.1:6379>lpush character b
(integer)2
redis 127.0.0.1:6379>lpush character c
(integer)3
redis 127.0.0.1:6379>lrange character 1 2
1)"a"
2)"b"
redis 127.0.0.1:6379>lrange character 1 3
1)"a"
2)"b"
3)"c"
redis 127.0.0.1:6379>lrange character 0 3
1)"0"
2)"a"
3)"b"
4)"c"
不管这个链表有多少元素,则立即可以看到它所有元素
redis 127.0.0.1:6379>lrange character 0 -1
1)"0"
2)"a"
3)"b"
4)"c"

13.rpop key:作用:返回并删除链表尾元素

rpush lpop:
redis 127.0.0.1:6379>rpop character
"c"
redis 127.0.0.1:6379>lrange character 0 -1
1)a"
2)"b"
redis 127.0.0.1:6379>flushdb
OK
redis 127.0.0.1:6379>lpush answer a b c a b d a
(integer)7
redis 127.0.0.1:6379>lrange character 0 -1
1)"a"
2)"b"
3)"d"
4)"a"
5)"c"
6)"b"
7)"a"
在这里先删一个b,给的是整数就从头部往尾部删
redis 127.0.0.1:6379>lrem answer 1 b
(integer) 1
redis 127.0.0.1:6379>lrange anser 0 -1  再次查看所有内容
1)"a"
2)"d"
3)"a"
4)"c"
5)"b"
6)"a"
从尾部开始删2个a
redis 127.0.0.1:6379>lrem answer -2 a
(integer) 2
redis 127.0.0.1:6379> lrange answer 0 -1
1)"a"
2)"d"
3)"c"
4)"b"
redis 127.0.0.1:6379>flushdb
OK
redis 127.0.0.1:6379>rpush a b c d e f
(integer) 5
redis 127.0.0.1:6379>flushdb 
OK
redis 127.0.0.1:6379>rpush character a b c d e f
(integer)6
redis 127.0.0.1:6379>lrange character 0 -1
1)"a"
2)"b"
3)"c"
4)"d"
5)"e"
6)"f"
redis 127.0.0.1:6379>ltrim character 2 5
OK
redis 127.0.0.1:6379>lrange character 0 -1
1)"c"
2)"d"
3)"e"
4)"f"
redis 127.0.0.1:6379>ltrim character 1 -2
OK
redis 127.0.0.1:6379>lrange character 0 -1
1)"d"
2)"e"
redis 127.0.0.1:6379>lindex character 0
"d"
redis 127.0.0.1:6379>lindex character 1
"e"
redis 127.0.0.1:6379>lindex character 2
(nil)
redis 127.0.0.1:6379>llen  character
(integer)2
redis 127.0.0.1:6379> rpush b c d
(integer)2
redis 127.0.0.1:6379>llen  character
(integer)2
redis 127.0.0.1:6379>rpush character b c d
(integer)5
redis 127.0.0.1:6379>llen character
(integer)5
redis 127.0.0.1:6379> rpush num 1 3 6 8 9
(integer)5
redis 127.0.0.1:6379>linsert num before 3 2
(integer)6
redis 127.0.0.1:6379>lrange num 0 -1
1)"1"
2)"2"
3)"3"
4)"6"
5)"8"
6)"9"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
(integer)
redis 127.0.0.1:6379>
(integer)
lrange key start stop:作用:返回链表中[start,stop]中的元素
规律:左数从0开始,右数从-1开始

14.lrem key count value

作用:从key链表中删除value值
注: 删除count的绝对值个value后介绍、Count>0 从表头删除 Count<0 从表尾删除
Itrim key start stop:作用:剪切key对应的链接,切[start,stop]一段,并把该段重新赋值给key
lindex key index 作用:返回index索引上的值。
(nil)

05.Redis知识点五:位图法统计活跃用户

1.国外某大型网站有10亿用户,有频繁登录的,也有不经常登录的 2,如何来记录用户的登录信息 3:如何来查询活跃用户,【如1周内 登录3次的。 每周评出:有奖活跃用户:练习7天活动 每月评,

建一张用户表的登录表,登录时间
uid
logtime
上亿用户,每天有1亿用户登录,2天2亿  3天3亿数据依此类推..
面对这样爆发性数据增长如何处理。
思路:这个人今天登录了没有,要么登录了要么没有登录可以用,因此可以通过信息的角度来看  1/0表示这个人今天是否有登录。
uid 用户有7个
第一位没有连号用户所以设置位0
uid       1   2   3    4  5  6  7
周一: 0   1   0   1    0  0  0  1
周二: 0   1   1   0    0  1  1  1
周三: 0   1   1   0
周四
周五
周六

redis 127.0.0.1.6379>setbit mon 0000 0000 0
(integer)0
redis 127.0.0.1.6379>setbit min 3 1
(integer)0
redis 127.0.0.1.6379>setbit mon 5 1  
(integer)0
redis 127.0.0.1.6379>setbit mon 7 1
(integer)0
redis 127.0.0.1.6379>setbit teb 0000 0000 0
(integer)0
redis 127.0.0.1.6379>setbit teb 3 1
(integer)0
redis 127.0.0.1.6379>setbit fed 5 1
(integer)0
redis 127.0.0.1.6379>setbit fed 8 1
(integer)0
redis 127.0.0.1.6379>setbit wen 3 1
(integer)0
redis 127.0.0.1.6379>setbit wen 6 1
(integer)0
redis 127.0.0.1.6379>bitop and resmin feb  wen
(integer)12500001

位图法统计活跃用户有以下优点: 1节约空间,1亿用户bit约10M的字符就能表示 2计算方便

06.Redis知识点六:set结构及命令详解

集合的性质:唯一性,无序性,确定性

注意:在string和link的命令中,可以通过range来访问string中的某几个字符或某几个元素,但是因为集合的无序性,无法通过下标或范围来访问部分元素,因此想看元素,要么随机选一个,要么全选。

01.sadd key value1 value2 作用:往key中增加元素

redis 127.0.0.1:6379>sadd gender(给集合取一个名称) male female
(integer)2//给集合增加元素成功了2个元素
redis 127.0.0.1:6379>sadd gender yao yao 
(integer)1  //集合具有唯一性
redis 127.0.0.1:6379>sadd gender yao
(integer)0  //yao 这个元素已经存在了所以为0
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

02.srem value value1 value2 作用:删除集合中集为value1 value2的元素 返回值:忽略不存在的元素后,真正删除掉的元素的个数

redis 127.0.0.1:6379>srem gender yao
(integer)1
redis 127.0.0.1:6379>smembers gender
1)"female"
2)"male"
redis 127.0.0.1:6379>srem genders x c
(integer)0  //没有的值,它删除不了
redis 127.0.0.1:6379>srem gender male x c
(integer)1  //没有的值它删除不了,它只能删除有的值

03.spop key 作用:返回并删除集合中key中的1个随机元素 随机体系了无序性

redis 127.0.0.1:6379>sadd gender a b c d e f //添加一些元素
(integer)6
redis 127.0.0.1:6379>smembers gender  //查看gender的所有元素
1)"e"
2)"a"
3)"d"
4)"female"
5)"b"
6)"c"
7)"f"
redis 127.0.0.1:6379>spop gender
"d"
redis 127.0.0.1:6379>smembers gender
1)"e"
2)"a"
3)"female"
4)"b"
5)"c"
6)"f"
redis 127.0.0.1:6379>spop gender
"b"
redis 127.0.0.1:6379>spop gender
"e"
redis 127.0.0.1:6379>spop gender
"a"
redis 127.0.0.1:6379>spop gender
"c"
redis 127.0.0.1:6379>spop gender
"f"

04. srandmember key 作用:返回集合key中,随机的1个元素。

//随机抛出,而又不把它删除掉
redis 127.0.0.1:6379> sadd gender a b c d e
(integer)5
redis 127.0.0.1:6379>srandmember gender
"c"
redis 127.0.0.1:6379>srandmember gender
"c"
redis 127.0.0.1:6379>srandmember gender
"f"
redis 127.0.0.1:6379>srandmember gender
"f"
redis 127.0.0.1:6379>srandmember gender
"a"
redis 127.0.0.1:6379>srandmember gender
"e"
redis 127.0.0.1:6379>srandmember gender
"f"
redis 127.0.0.1:6379>srandmember gender
"f"

05. sismember key value 作用:判断value是否在key集合中 是返回1,否返回0

//想看看这个集合里面有没有这个元素?
redis 127.0.0.1:6379>smembers gender
1)"e"
2)"d"
3)"a"
4)"c"
5)"b"
6)"female"
7)"f"
redis 127.0.0.1:6379> sismember gender Q  //查看Q是否是gender里面的value
(integer)0  //0为不是gender的value
redis 127.0.0.1:6379> sismember gender f
(integer)1
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

06.smembers key 作用:返回(查看)集合中所有的元素

redis 127.0.0.1:6379>smembers gender
1)"female"
2)"yao"
3)"male"//这里没有按照添加的顺序排序下来,可能是随机性的

07. scard key 作用:返回集合中元素的个数

redis 127.0.0.1:6379>scard gender
(integer)7

08.smove source dest value(必须针对两个集合来操作) 作用:把source中的value删除,并添加到dest集合中

s  move是移动的意思,给你一个Source的集合,dest目标集合,指定一个value(它将要怎么做),就将source里面种的某个value移动到dest目标集合里面去。
redis 127.0.0.1:6379>sadd upper A B C
(integer)3
redis 127.0.0.1:6379>sadd lower a b c
(integer)3
redis 127.0.0.1:6379>smove upper lower A  //将upper的A移动到lower里面去
(integer)1
redis 127.0.0.1:6379>smembers upper
1)"C"
2)"B"
redis 127.0.0.1:6379>smembers lower
1)"c"
2)"b"
3)"a"
4)"A"
redis 127.0.0.1:6379>smove lower upper A
(integer)1
redis 127.0.0.1:6379>smembers lower
1)"c"
2)"b"
3)"a"
redis 127.0.0.1:6379>smembers upper
1)"C"
2)"B"
3)"A"

09.sinter key1 key2 key3 作用:求出key1 key2 key3 三个集合中的交集,并返回

redis 127.0.0.1:6379>sadd s1 0 2 4 6
(integer) 4
redis 127.0.0.1:6379>sadd s2 1 2 3 4
(integer) 4
redis 127.0.0.1:6379>sadd s3 4 8 9 12
(integer) 4
redis 127.0.0.1:6379>sinter s1 s2 s3
1)"4"
redis 127.0.0.1:6379>sinter s1 s2 s3
1)"4"

redis 127.0.0.1:6379>sadd lisi a b c d
(integer) 4
redis 127.0.0.1:6379>sadd wang a c d e f
(integer) 5
redis 127.0.0.1:6379>sadd poly a c d g
(integer) 4
redis 127.0.0.1:6379>sinter lisi wang poly
1)"d"
2)"c"
3)"a"
redis 127.0.0.1:6379>

10.sinterstore dest key1 key2 key3 作用:求出key1 key2 key3 三个集合中的交集,并赋给dest

//如果需要将这个结果存起来
redis 127.0.0.1:6379>sinter lisi wang poly
1)"d"
2)"c"
3)"a"
redis 127.0.0.1:6379>sinterstore result lisi wang poly
(integer)3
redis 127.0.0.1:6379>smembers result
1)"d"
2)"c"
3)"a"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

11.suion key1 key2..Keyn 作用:求出key1 key2 keyn的并集,并返回

redis 127.0.0.1:6379>sadd lisi a b c d
(integer) 4
redis 127.0.0.1:6379>sadd wang a c d e f
(integer) 5
redis 127.0.0.1:6379>sadd poly a c d g
(integer) 4
redis 127.0.0.1:6379>sunion lisi wang poly
1)"e"
2)"d"
3)"a"
4)"g"
5)"c"
6)"b"
7)"f"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

12.sdiff key1 key2 key3 作用:求出key1与key2 key3的差集 即 key1-key2-key3

redis 127.0.0.1:6379>sadd lisi a b c d
(integer) 4
redis 127.0.0.1:6379>sadd wang a c d e f
(integer) 5
redis 127.0.0.1:6379>sadd poly a c d g
(integer) 4
redis 127.0.0.1:6379>sdiff lisi wang
1)"b"

07.Redis知识点七:order set结构及命令详解

有序集合 用什么排序呢?需要给它一个排序因子,既然有序每个元素就自身有一个权重或者说因子,为了方便讨论我们称之为score.在声明这个集合的时候,它不仅要声明这个集合的值,还有声明这个元素的score.如果没有score就达不到有序了。

01.zadd key score1 value1 score2 value2... 添加元素

redis 127.0.0.1:6379>zadd stu 18 lily 19 hmm 20 lilei 21 lilei
(integer)3
redis 127.0.0.1:6379>zadd class 12 lily 13 lucy 6 lilei 21 poly
(integer)4

02.zrem key value1 value2 删除集合中的元素

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

03.zremrangebyscore key min max 作用:按照socre 来删除元素,删除score在[min,max]之间的

redis 127.0.0.1:6379>zremrangebyscore stu 4 10
(integer)2
redis 127.0.0.1:6379>zrange stu 0 -1
1)"f"

04.zremrangebyrank key start end 作用:按照排名删除元素,删除名次在[start,end]之间的

redis 127.0.0.1:6379>zremrangebyrank stu 0 1
(integer)2
redis 127.0.0.1:6379>zrange stu 0 -1
1)"c"
2)"e"
3)"f"
4)"g"

05.zrank key member 作用:查询member 的排名(升序0名开始)

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

06.zrevrank key memeber 作用:查询member的排名(降序0名开始)

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

07.zrange key start stop [withscores] 作用:把集合排序后,返回名次[start,stop]的元素 默认是升序排序,withscres是把score也打印出来。

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

08.zrevrange key start stop 作用: 把集合降序排列,取名字[start,stop]之间的元素。

redis 127.0.0.1:6379>zadd class 12 lily 13 lucy 6 lilei 21 poly
(integer)4
redis 127.0.0.1:6379>zrank class 0 3  //这里是第0名到第3名之间的
1)"poly"
2)"lily"
3)"lucy"
4)"lilei"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

09.zrangeby score Key min max [withscores]limit offset N 作用:集合(升序)排序后,取score在[min,max]内的元素,并跳过offser个,取出N个

redis 127.0.0.1:6379>zadd stu 1 a 3 b 4 c9 e 12 f 15 g
(integer)6
redis 127.0.0.1:6379>zrangebyscore stu 3 12 limit 1 2 withsocres
1)"c"
2)"4"
3)"e"
4)"9"
//在这里还是取里面的元素,不过是按分数来取里面的值。
redis 127.0.0.1:6379>zadd class 12 lily 13 lucy 6 lilei 21 poly
(integer)4
redis 127.0.0.1:6379>zrangebyscore class 13 18
1)""
2)""

10.zcard key 作用:返回元素个数

redis 127.0.0.1:6379>zrangebyscore class 13 18  //取13岁到18岁的值
1)"lucy"
2)"lilei"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

11.zcount key min max 作用:[min,max]区间内元素的数量

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

12.zinterstore destination numkeys key1 [key2...]

[weights weight[weight....]]
[Aggregate sum|min|max]
求key1,key2的交集,key1,key2的权重分布是weight,weight2
聚合方法用:sum|min|max
聚合的结构,保持在dest集合内
注意:weights,aggregate 如何理解?
答:如果有解决,交集元素又有score,score怎么处理?Aggreegate sum->score 相加,min求最小score,max最大score

另:可以通过weight 设置不同key的权重,交集时,socre*weights

redis 127.0.0.1:6379>zadd z1 2 a 3 b 4 c
(integer)3
redis 127.0.0.1:6379>zadd z3 2.5 a 1 b 8 d
(integer)2
redis 127.0.0.1:6379>zinterstore tmp 2 z1 z2
redis 127.0.0.1:6379>zrange tmp 0 -1
1)"b"
2)"a"
redis 127.0.0.1:6379>zrange tmp 0 -1 withscores
1)"b"
2)"4"
3)"a"
4)"4.5"
redis 127.0.0.1:6379>zinterstore tmp 2 z1 z2 aggregate sum
(integer)2
redis 127.0.0.1:6379>zrange tmp 0 -1 withscores
1)"b"
2)"4"
3)"a"
4)"4.5"
redis 127.0.0.1:6379>zinterstore tmp 2 z1 z2 aggregate min
(integer)2
redis 127.0.0.1:6379>zrange tmp 0 -1 withscores
1)"b"
2)"l"
3)"a"
4)"2"
redis 127.0.0.1:6379>zinterstore tmp 2 z1 z2 weights 1 2
(integer)2
redis 127.0.0.1:6379>zrange tmp 0 -1 withscores
1)"b"
2)"l"
3)"a"
4)"2"
redis 127.0.0.1:6379>zinterstore tmp 2 z1 z2 weights 1 2
(integer)2
redis 127.0.0.1:6379>zrange tmp 0 -1 withscores
1)"b"
2)"5"
3)"a"
4)"7"
redis 127.0.0.1:6379>

08.Redis知识点八:hash结构及命令详解

01.hset key field value 作用:把key中filed域的值设为value 注意:如果没有field域。直接添加,如果有,则覆盖原field域的值。

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

02.hmset key field1 value1[field2 value2 field3 value3 .....fieldn valuen] 作用:设置field1 ->N个域,对应的值是value1->N (对应PHP理解为$key=array(file1=>value1,field2=>value2......fuekdB=>valueN))

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

03.hget key field 作用:返回key中field域的值

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

04.hmget key field1 field2 fieldN 作用:返回key中的field1 field2 fieldN域的值。

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

05.hgetall key 作用:返回key中,所有域与其值。

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

06.hdel key field 作用:删除key中的field域

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

07.hlen key 作用:返回key中的元素的数量

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

08.hexists key field 作用:判断key中有没有field域。

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

09.hinrby key field value 作用:是把key中的field域的值增长整项值value

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

10.hinrby float key field value 作用:是把key中的fiekd域的值增长浮点值value

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

11.hkeys key 作用:返回key中所有的field

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

12.kvals key 作用:返回key中所有的value

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

09.Redis知识点九:redis事务及锁应用

Redis支持简单的事务

Redis与MySql事务的对比

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

010.Redis知识点十:频道发表与消息订阅

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

1

redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>

011.Redis知识点十一:rdb快照持久化

持久化方式:持久化:把数据存储于断电后不会丢失的设备中,通常是硬盘。

常见的持久化方式:
主从: 通常从服务器保持和持久化,如mongoDB的replication sets 配置
日志:操作生成相关日志,并通过日志来恢复数据 couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据

Redis常见的两种持久方式一(rdb快照持久化):

rdb的工作原理:每隔N分钟或N次写操作后,从内容dump数据形成rdb文件,压缩放在备份目录。

注意: N分钟或N次,压缩,目录部分可通过参数来配置。

rdb快照相关参数:

save 900 1    #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后1个关键字发生变化。
save 300 10   #必须是300秒之后至少10个关键字发生变化。
save 60 10000 #必须是60秒之后至少10000个关键字发生变化。
stop-writes-on-bgsave-error yes #后台存储错误停止写。
rdbcompression yes #使用LZF压缩rdb文件时校验。
dbfilename dump.rdb #设置rdb文件名。
dir ./ #设置工作目录,rdb文件会写入该目录。 

012. Redis知识点十二:aof日志持久化

013.Redis知识点十三:redis主从复制

014.Redis知识点十四:redis运维常用命令

015.Redis知识点十五:aof恢复与rdb服务器间迁移

016.Redis知识点十六:sentinel运维监控

017.Redis知识点十七:key设计原则

018.Redis知识点十八:phpRedis扩展边要

019.Redis知识点十九:微博i项目之用户注册与微博发布

020.Redis知识点二十:微博项目之粉丝关系与推送微博

021.Redis知识点二十一:增强微博cookie安全

022.Redis知识点二十二:哈希数据存储微博

023.Redis知识点二十三:微博key设计总结

024.Redis知识点二十四:粉丝拉取模式

025.Redis知识点二十五:微博冷数据写入mysql

026.Redis知识点二十六:高速写入测试

猜你喜欢

转载自www.cnblogs.com/SteveDZC/p/10462952.html