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文件,建议定期备份。
数据持久化,空难恢复相关内容,下次再讲。

5.安全

6.连接处理

7.高可用

posted @ 2019-01-19 11:11  一只特立独行的程序猿  阅读(376)  评论(0编辑  收藏  举报