Redis 简介及应用
更多内容参见个人技术博客,无广告欢迎关注
什么是Redis
Redis基本数据类型
Redis编程
Redis管理
小结
什么是Redis
1.简介
- Redis是一个key-value存储系统。比起memcache, 支持的更多的数据结构。
- redis可以用作数据库、缓存、消息中间件等
2.安装
$ wget http://download.redis.io/releases/redis-3.2.5.tar.gz
$ tar xzf redis-3.2.5.tar.gz
$ cd redis-3.2.5
$ make
- 如果还要把redis当作服务,还需要一些操作,此处略
- 如果没有安装gcc, 请先安装
(centOS)
yum install gcc
(ubuntu)
apt-get install gcc
Redis基本数据类型
Redis keys
Redis key值是二进制安全的,可用任何二进制序列作为key. 但是最好遵守一些规则:
- key值别太长
- key值别太短
- 最好坚持一种模式。例如:"user:1001:name"
- 最大为512M (但千万不要这样做)
Redis key是自动创建的,如果值是空的了,会直接删除
1. Strings
/a>127.0.0.1:6379> set key value
OK
127.0.0.1:6379> get key
"value"
127.0.0.1:6379>
- 从2.6.12版本后,set增加了一系列选项
set key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds – 设置键key的过期时间,单位时秒
PX milliseconds – 设置键key的过期时间,单位时毫秒
NX – 只有键key不存在的时候才会设置key的值
XX – 只有键key存在的时候才会设置key的值
- 可以当作整形做些有趣操作,而且是当作原子操作
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> get age
"100"
127.0.0.1:6379> incr age
(integer) 101
127.0.0.1:6379> incrby age 20
(integer) 121
127.0.0.1:6379> decr age
(integer) 120
127.0.0.1:6379> decrby age 10
(integer) 110
- 可以批量
127.0.0.1:6379> mset age 100 name ddy
OK
127.0.0.1:6379> mget age name
1) "100"
2) "ddy"
- getset返回旧值,设置新值 (目前用户下单时就是用这个设置一个全局锁,防止用户短时间内重复下单)
127.0.0.1:6379> getset age 101
"100"
- 更多... (ttl指time to live), 帮助请参数 help @string 或者 help set 等等
127.0.0.1:6379> exists age
(integer) 1
127.0.0.1:6379> type age
string
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> exists age
(integer) 0
127.0.0.1:6379> type age
none
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> get name
(nil)
2. Lists
List指的是一序列有序元素。Reids lists基于linked Lists实现的(在头部或尾部添加数据,时间复杂度是常量级别的,但相比于Array Lists,按下标取数据较慢)
基于linked Lists实现,原因是:能非常快地在很大的列表上添加元素,在常数的时间取得长度。如果快速访问集合元素很重要,建议使用可排序集合(sorted sets)
- 在list 左边及右边加入数据
127.0.0.1:6379> rpush mylist aa
(integer) 1
127.0.0.1:6379> rpush mylist bb
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "aa"
2) "bb"
127.0.0.1:6379> lpush mylist 11
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "11"
2) "aa"
3) "bb"
127.0.0.1:6379> rpush mylist cc dd
(integer) 5
127.0.0.1:6379> lpush mylist 00 -1
(integer) 7
127.0.0.1:6379> lrange mylist 0 -1
1) "-1"
2) "00"
3) "11"
4) "aa"
5) "bb"
6) "cc"
7) "dd"
- 从list 左边及右边弹出数据
127.0.0.1:6379> rpop mylist
"dd"
127.0.0.1:6379> lpop mylist
"-1"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "00"
2) "11"
3) "aa"
4) "bb"
5) "cc"
- 阻塞的 brpop 及 blpop, 即除非有数据,或者已经timeout时间已到才返回。如果timeout为0,则会一直等待,直到有数据弹出
127.0.0.1:6379> BLPOP mytask 0
会一直等待,直到在有数据进入mytask
127.0.0.1:6379> lpush mytask task1
(integer) 1
127.0.0.1:6379
刚刚那个才执行完
127.0.0.1:6379> BLPOP mytask 0
1) "mytask"
2) "task1"
(141.62s)
- ltrim 命令让list只保留某个区间的数据,其它将被废弃
127.0.0.1:6379> LTRIM mylist 0 2
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "00"
2) "11"
3) "aa"
- 帮助请参数 help @list 或者 help lpush 等等
3. Sets
- Redis Sets 是无序的字符串集合。因为是无序的,所以查的时候,返回的顺序可能不同. (scard中的card是指cardinal number,即基数)
127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> srandmember myset 2
1) "2"
2) "3"
127.0.0.1:6379> sismember myset 1
(integer) 0
127.0.0.1:6379> sismember myset 4
(integer) 0
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> srem myset 1
(integer) 0
127.0.0.1:6379> sismember myset 1
(integer) 0
127.0.0.1:6379> scard myset
(integer) 2
-
假设
-
梅花clubs 方块diamonds 红桃hearts 黑桃spades
4. Hashs
- Redis Hashs 有点像java中的对象,key field与value. 目前购物车数据就是通过hash来存的。
127.0.0.1:6379> hmset user:1001 name wdanny age 18 gender 女
OK
127.0.0.1:6379> hget user:1001 name
"wdanny"
127.0.0.1:6379> hmget user:1001 name gender
1) "wdanny"
2) "\xe5\xa5\xb3"
127.0.0.1:6379> hgetall user:1001
1) "name"
2) "wdanny"
3) "age"
4) "18"
5) "gender"
6) "\xe5\xa5\xb3"
- wdanny 突然长大两岁,可以直接通过 hincrby实现.(类似还有hincrbyfloat, 如果抢到很多红包,可以用这个来实现)
127.0.0.1:6379> hincrby user:1001 age 2
(integer) 20
127.0.0.1:6379> hget user:1001 age
"20"
- 帮助请参数 help @hash 或者 help hget 等等`
5. Bit arrays
Redis管理
1.Redis-cli
Redis-cli是内置的客户端。主要有两个使用模式:命令行模式与交互模式
- 命令行模式
[root@t106 src]# ./redis-cli hincrby user:1001 age 2
(integer) 21
[root@t106 src]# ./redis-cli --raw hincrby user:1001 age 2
23
[root@t106 src]# ./redis-cli -h 192.168.0.25 -p 6379 ping
PONG
[root@t106 src]# ./redis-cli lpush mylist a b c d
(integer) 11
[root@t106 src]# ./redis-cli --csv lrange mylist 0 -1
"d","c","b","a","-1","00","11","aa","bb","cc","dd"
- 交互模式
[root@t106 src]# ./redis-cli
127.0.0.1:6379> dbsize
(integer) 12
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 12
127.0.0.1:6379>
127.0.0.1:6379> 5 incr mycounter
(integer) 1
(integer) 2
(integer) 3
(integer) 4
(integer) 5
127.0.0.1:6379> help @set
- 特殊操作模式(还有很多,不一一例举)
[root@t106 src]# ./redis-cli --stat
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
13 803.05K 1 0 172 (+0) 15
[root@t106 src]# ./redis-cli --bigkeys
[root@t106 src]# ./redis-cli --scan
[root@t106 src]# ./redis-cli monitor
[root@t106 src]# ./redis-cli --latency
2.参数配置
- Redis 如果启动时没有传相关配置,会使用内置的默认配置。但建议提供一个配置文件,一般名称为redis.conf,在启动时传入(./redis-server redis.conf)。配置规则很简单
keyword argument1 argument2 ... argumentN
slaveof 127.0.0.1 6380
requirepass "hello world"
- Rdis 还可以通过直接传参方式,只是在 keyword前加上前缀--
./redis-server --port 6380 --slaveof 127.0.0.1
- Redis 在运行时,如果更改配置?。注意重启服务后这样的更改会失效
help config set
help config get
127.0.0.1:6379> config get port
1) "port"
2) "6379"
127.0.0.1:6379> config get *
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
127.0.0.1:6379> config set slowlog-max-len 256
OK
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> config set slowlog-max-len 128
OK
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
- Redis 主要参数说明
3.主从配置
4.持久化
Redis数据不仅可以保存在内容中,还可以持久化。主要有两种策略 RDB() 与 AOF(append-only fashion)
- RDB持久化指的是在指定的时间间隔内生成的数据集的时间点快照
- AOF持久化记录服务器执行的所有写操作,并在服务器启动时,通过重新执行这些命令来还原数据集。
这两种方法各有优缺点,数据一般分别保存为dump.rdb文件与.aof文件,建议定期备份。
数据持久化,空难恢复相关内容,下次再讲。