redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的web应用程序。
redis有三个主要特点,使它优越于其它键值数据存储系统 -
redis官方网网站是:http://www.redis.io/ ,如下:
以下是redis的一些优点。
110000
次的设置(set
)操作,每秒大约可执行81000
次的读取/获取(get
)操作。redis是键值数据库系统的不同进化路线,它的值可以包含更复杂的数据类型,可在这些数据类型上定义原子操作。
redis是一个内存数据库,但在磁盘数据库上是持久的,因此它代表了一个不同的权衡,在这种情况下,在不能大于存储器(内存)的数据集的限制下实现非常高的写和读速度。
内存数据库的另一个优点是,它与磁盘上的相同数据结构相比,复杂数据结构在内存中存储表示更容易操作。 因此,redis可以做很少的内部复杂性。
在本章中,您将了解和学习redis的环境安装设置。
要在ubuntu上安装redis,打开终端并键入以下命令 -
[h3@ubuntu:~]$ sudo apt-get update
[h3@ubuntu:~]$ sudo apt-get install redis-server
这将在ubuntu机器上安装redis。
启动redis
[h3@ubuntu:~]$ redis-server
[2988] 07 feb 17:09:42.485 # warning: no config file specified, using the default config. in order to specify a config file use redis-server /path/to/redis.conf
[2988] 07 feb 17:09:42.488 # unable to set the max number of files limit to 10032 (operation not permitted), setting the max clients configuration to 3984.
[2988] 07 feb 17:09:42.490 # warning: 32 bit instance detected but no memory lim
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ redis 2.8.4 (00000000/0) 32 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) running in stand alone mode
|`-._`-...-` __...-.``-._|'` _.-'| port: 6379
| `-._ `._ / _.-' | pid: 2988
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
[2988] 07 feb 17:09:42.581 # server started, redis version 2.8.4
[2988] 07 feb 17:09:42.582 # warning overcommit_memory is set to 0! background s ' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_m
[2988] 07 feb 17:09:42.582 * the server is now ready to accept connections on po
检查redis是否正在工作
[h3@ubuntu:~]$ redis-cli
这将打开一个redis提示,如下所示 -
redis 127.0.0.1:6379>
在上面的提示中,127.0.0.1
是计算机的ip地址,6379
是运行redis服务器的端口。 现在键入以下ping
命令。
redis 127.0.0.1:6379> ping
pong
这表明redis已成功在您的计算机上安装了。
在ubuntu上安装redis桌面管理
要在ubuntu上安装redis桌面管理器,可从 http://redisdesktop.com/download 下载该软件包,安装即可。
打开下载的软件包并安装。
redis桌面管理器将提供用于管理redis的键和数据的ui。
在redis中,在redis的根目录下有一个配置文件(redis.conf
)。当然您可以通过redis config
命令获取和设置所有的redis配置。
语法
以下是redis中的config
命令的基本语法。
redis 127.0.0.1:6379> config get config_setting_name
示例
redis 127.0.0.1:6379> config get loglevel
1) "loglevel"
2) "notice"
要获取所有配置设置,请使用
*
代替config_setting_name
示例
redis 127.0.0.1:6379> config get *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
7) "unixsocket"
8) ""
9) "logfile"
10) "/var/log/redis/redis-server.log"
11) "pidfile"
12) "/var/run/redis/redis-server.pid"
13) "maxmemory"
14) "3221225472"
15) "maxmemory-samples"
16) "3"
17) "timeout"
18) "0"
19) "tcp-keepalive"
20) "0"
21) "auto-aof-rewrite-percentage"
22) "100"
23) "auto-aof-rewrite-min-size"
24) "67108864"
25) "hash-max-ziplist-entries"
26) "512"
27) "hash-max-ziplist-value"
28) "64"
29) "list-max-ziplist-entries"
30) "512"
31) "list-max-ziplist-value"
32) "64"
33) "set-max-intset-entries"
34) "512"
35) "zset-max-ziplist-entries"
36) "128"
37) "zset-max-ziplist-value"
38) "64"
39) "lua-time-limit"
40) "5000"
41) "slowlog-log-slower-than"
42) "10000"
43) "slowlog-max-len"
44) "128"
45) "port"
46) "6379"
47) "databases"
48) "16"
49) "repl-ping-slave-period"
50) "10"
51) "repl-timeout"
52) "60"
53) "repl-backlog-size"
54) "1048576"
55) "repl-backlog-ttl"
56) "3600"
57) "maxclients"
58) "3984"
59) "watchdog-period"
60) "0"
61) "slave-priority"
62) "100"
63) "min-slaves-to-write"
64) "0"
65) "min-slaves-max-lag"
66) "10"
67) "hz"
68) "10"
69) "no-appendfsync-on-rewrite"
70) "no"
71) "slave-serve-stale-data"
72) "yes"
73) "slave-read-only"
74) "yes"
75) "stop-writes-on-bgsave-error"
76) "yes"
77) "daemonize"
78) "yes"
79) "rdbcompression"
80) "yes"
81) "rdbchecksum"
82) "yes"
83) "activerehashing"
84) "yes"
85) "repl-disable-tcp-nodelay"
86) "no"
87) "aof-rewrite-incremental-fsync"
88) "yes"
89) "appendonly"
90) "no"
91) "dir"
92) "/var/lib/redis"
93) "maxmemory-policy"
94) "noeviction"
95) "appendfsync"
96) "everysec"
97) "save"
98) "900 1 300 10 60 10000"
99) "loglevel"
100) "notice"
101) "client-output-buffer-limit"
102) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
103) "unixsocketperm"
104) "0"
105) "slaveof"
106) ""
107) "notify-keyspace-events"
108) ""
109) "bind"
110) "127.0.0.1"
要更新配置,可以直接编辑redis.conf
文件,也可以通过config set
命令更新配置。
语法
以下是config set
命令的基本语法。
redis 127.0.0.1:6379> config set config_setting_name new_config_value
示例
redis 127.0.0.1:6379> config set loglevel "notice"
ok
redis 127.0.0.1:6379> config get loglevel
1) "loglevel"
2) "notice"
redis支持5
种数据类型。
redis中的字符串是一个字节序列。redis中的字符串是二进制安全的,这意味着它们的长度不由任何特殊的终止字符决定。因此,可以在一个字符串中存储高达512
兆字节的任何内容。
示例
redis 127.0.0.1:6379> set name "h3.com"
ok
redis 127.0.0.1:6379> get name
"h3.com"
在上面的示例中,set
和get
是redis命令,name
是redis中使用的键,h3.com
是存储在redis中的字符串的值。
注 - redis命令不区分大小写,如
set
,set
和set
都是同一个命令。字符串值的最大长度为 512mb。
redis散列/哈希(hashes)是键值对的集合。redis散列/哈希是字符串字段和字符串值之间的映射。因此,它们用于表示对象。
示例
redis 127.0.0.1:6379> hmset ukey username "h3" password "passswd123" points 200
在上述示例中,散列/哈希数据类型用于存储包含用户的基本信息的用户对象。这里hmset
,hgetall
是redis的命令,而ukey
是键的名称。
每个散列/哈希可以存储多达2^32 - 1
个健-值对(超过40
亿个)。
redis列表只是字符串列表,按插入顺序排序。您可以向redis列表的头部或尾部添加元素。
示例
redis 127.0.0.1:6379> lpush alist redis
(integer) 1
redis 127.0.0.1:6379> lpush alist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush alist sqlite
(integer) 3
redis 127.0.0.1:6379> lrange alist 0 10
1) "sqlite"
2) "mongodb"
3) "redis"
列表的最大长度为2^32 - 1
个元素(4294967295
,每个列表可容纳超过40
亿个元素)。
redis集合是字符串的无序集合。在redis中,您可以添加,删除和测试成员存在的时间o(1)复杂性。
示例
redis 127.0.0.1:6379> sadd h3list redis
(integer) 1
redis 127.0.0.1:6379> sadd h3list mongodb
(integer) 1
redis 127.0.0.1:6379> sadd h3list sqlite
(integer) 1
redis 127.0.0.1:6379> sadd h3list sqlite
(integer) 0
redis 127.0.0.1:6379> smembers h3list
1) "sqlite"
2) "mongodb"
3) "redis"
注意 - 在上面的示例中,
sqlite
被添加了两次,但是由于集合的唯一属性,所以它只算添加一次。
一个集合中的最大成员数量为2^32 - 1
(即4294967295
,每个集合中元素数量可达40
亿个)个。
redis可排序集合类似于redis集合,是不重复的字符集合。 不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。虽然成员是唯一的,但分数值可以重复。
示例
redis 127.0.0.1:6379> zadd h3set 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd h3set 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd h3set 1 sqlite
(integer) 1
redis 127.0.0.1:6379> zadd h3set 1 sqlite
(integer) 0
redis 127.0.0.1:6379> zrangebyscore h3set 0 1000
1) "mongodb"
2) "redis"
3) "sqlite"
因为 ‘sqlite
‘ 的排序值是 1 ,其它两个元素的排序值是 0 ,所以 ‘sqlite
‘ 排在最后一个位置上。
redis命令是用于在redis服务器上执行一些操作。
要在redis服务器上运行命令,需要一个redis客户端。redis客户端在redis包中有提供,这个包在我们前面的安装教程中就有安装过了。
语法
以下是redis客户端的基本语法。
[h3@ubuntu:~]$ redis-cli
示例
以下示例说明了如何启动redis客户端。
要启动redis客户端,请打开终端并键入命令redis-cli
。 这将连接到您的本地redis服务器,现在可以运行任何的redis命令了。
[h3@ubuntu:~]$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> ping
pong
在上面的示例中,连接到到在本地机器上运行的redis服务器并执行ping
命令,该命令检查服务器是否正在运行。
要在redis远程服务器上运行命令,需要通过客户端redis-cli
连接到服务器
语法
[h3@ubuntu:~]$ redis-cli -h host -p port -a password
示例
以下示例显示如何连接到redis远程服务器,在主机(host)127.0.0.1
,端口(port)6379
上运行,并使用密码为 mypass
。
[h3@ubuntu:~]$ redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> ping
pong
redis键命令用于管理redis中的键。以下是使用redis键命令的语法。
语法
redis 127.0.0.1:6379> command key_name
示例
redis 127.0.0.1:6379> set akey redis
ok
redis 127.0.0.1:6379> del akey
(integer) 1
127.0.0.1:6379> get akey
(nil)
在上面的例子中,del
是redis的命令,而akey
是键的名称。如果键被删除,则命令的输出将为(integer) 1
,否则为(integer) 0
。
下表列出了与键相关的一些基本命令。
编号 | 命令 | 描述 |
---|---|---|
1 | del key | 此命令删除一个指定键(如果存在)。 |
2 | dump key | 此命令返回存储在指定键的值的序列化版本。 |
3 | exists key | 此命令检查键是否存在。 |
4 | expire key seconds | 设置键在指定时间秒数之后到期/过期。 |
5 | expireat key timestamp | 设置在指定时间戳之后键到期/过期。这里的时间是unix时间戳格式。 |
6 | pexpire key milliseconds | 设置键的到期时间(以毫秒为单位)。 |
7 | pexpireat key milliseconds-timestamp | 以unix时间戳形式来设置键的到期时间(以毫秒为单位)。 |
8 | keys pattern | 查找与指定模式匹配的所有键。 |
9 | move key db | 将键移动到另一个数据库。 |
10 | persist key | 删除指定键的过期时间,得永生。 |
11 | pttl key | 获取键的剩余到期时间。 |
12 | randomkey | 从redis返回一个随机的键。 |
13 | rename key newkey | 更改键的名称。 |
14 | pttl key | 获取键到期的剩余时间(以毫秒为单位)。 |
15 | renamenx key newkey | 如果新键不存在,重命名键。 |
16 | type key | 返回存储在键中的值的数据类型。 |
redis字符串命令用于管理redis中的字符串值。以下是使用redis字符串命令的语法。
redis 127.0.0.1:6379> command key_name
示例
redis 127.0.0.1:6379> set mykey "redis"
ok
redis 127.0.0.1:6379> get mykey
"redis"
在上面的例子中,set
和get
是redis中的命令,而mykey
是键的名称。
下表列出了一些用于在redis中管理字符串的基本命令。
编号 | 命令 | 描述说明 |
---|---|---|
1 | set key value | 此命令设置指定键的值。 |
2 | get key | 获取指定键的值。 |
3 | getrange key start end | 获取存储在键上的字符串的子字符串。 |
4 | getset key value | 设置键的字符串值并返回其旧值。 |
5 | getbit key offset | 返回在键处存储的字符串值中偏移处的位值。 |
6 | mget key1 [key2..] | 获取所有给定键的值 |
7 | setbit key offset value | 存储在键上的字符串值中设置或清除偏移处的位 |
8 | setex key seconds value | 使用键和到期时间来设置值 |
9 | setnx key value | 设置键的值,仅当键不存在时 |
10 | setrange key offset value | 在指定偏移处开始的键处覆盖字符串的一部分 |
11 | strlen key | 获取存储在键中的值的长度 |
12 | mset key value [key value …] | 为多个键分别设置它们的值 |
13 | msetnx key value [key value …] | 为多个键分别设置它们的值,仅当键不存在时 |
14 | psetex key milliseconds value | 设置键的值和到期时间(以毫秒为单位) |
15 | incr key | 将键的整数值增加1 |
16 | incrby key increment | 将键的整数值按给定的数值增加 |
17 | incrbyfloat key increment | 将键的浮点值按给定的数值增加 |
18 | decr key | 将键的整数值减1 |
19 | decrby key decrement | 按给定数值减少键的整数值 |
20 | append key value | 将指定值附加到键 |
redis hashes是字符串字段和字符串值之间的映射(类似于php中的数组类型)。 因此,它们是表示对象的完美数据类型。
在redis中,每个哈希(散列)可以存储多达4亿个键-值对。
redis 127.0.0.1:6379> hmset myhash name "redis tutorial"
description "redis basic commands for caching" likes 20 visitors 23000
ok
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
5) "name"
6) "redis tutorial"
在上面的例子中,在名称为’myhash
‘的哈希中设置了redis教程的详细信息(名称,描述,喜欢,访问者)。
redis列表只是字符串列表,按插入顺序排序。可以在列表的头部或尾部添加redis列表中的元素。
列表的最大长度为2^32 - 1
个元素(即4294967295
,每个列表可存储超过40亿个元素)。
redis 127.0.0.1:6379> lpush mylist "redis"
(integer) 1
redis 127.0.0.1:6379> lpush mylist "mongodb"
(integer) 2
redis 127.0.0.1:6379> lpush mylist "mysql"
(integer) 3
redis 127.0.0.1:6379> lrange mylist 0 10
1) "mysql"
2) "mongodb"
3) "redis"
在上面的示例中,通过命令lpush
将三个值插入到名称为“mylist
”的redis列表中。
redis集合是唯一字符串的无序集合。 唯一值表示集合中不允许键中有重复的数据。
在redis中设置添加,删除和测试成员的存在(恒定时间o(1),而不考虑集合中包含的元素数量)。列表的最大长度为2^32 - 1
个元素(即4294967295,每组集合超过40亿个元素)。
redis 127.0.0.1:6379> sadd myset "redis"
(integer) 1
redis 127.0.0.1:6379> sadd myset "mongodb"
(integer) 1
redis 127.0.0.1:6379> sadd myset "mysql"
(integer) 1
redis 127.0.0.1:6379> sadd myset "mysql"
(integer) 0
redis 127.0.0.1:6379> smembers "myset"
1) "mysql"
2) "mongodb"
3) "redis"
在上面的示例中,通过命令sadd
将三个值插入到名称为“myset
”的redis集合中。
redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息。传送消息的链路称为信道。
在redis中,客户端可以订阅任意数量的信道。
以下示例说明了发布用户概念的工作原理。 在以下示例中,一个客户端订阅名为“redischat
”的信道。
redis 127.0.0.1:6379> subscribe redischat
reading messages... (press ctrl-c to quit)
1) "subscribe"
2) "redischat"
3) (integer) 1
现在,两个客户端在名称为“redischat
”的相同信道上发布消息,并且上述订阅的客户端接收消息。
redis 127.0.0.1:6379> publish redischat "redis is a great caching technique"
(integer) 1
redis 127.0.0.1:6379> publish redischat "learn redis by h3"
(integer) 1
1) "message"
2) "redischat"
3) "redis is a great caching technique"
1) "message"
2) "redischat"
3) "learn redis by h3"
redis事务允许在单个步骤中执行一组命令。以下是事务的两个属性:
redis事务由命令multi
命令启动,然后需要传递一个应该在事务中执行的命令列表,然后整个事务由exec
命令执行。
redis 127.0.0.1:6379> multi
ok
list of commands here
redis 127.0.0.1:6379> exec
以下示例说明了如何启动和执行redis事务。
redis 127.0.0.1:6379> multi
ok
redis 127.0.0.1:6379> set mykey "redis"
queued
redis 127.0.0.1:6379> get mykey
queued
redis 127.0.0.1:6379> incr visitors
queued
redis 127.0.0.1:6379> exec
1) ok
2) "redis"
3) (integer) 1
redis脚本用于使用lua解释器来执行脚本。从redis 2.6.0
版开始内置到redis中。使用脚本的命令是eval命令。
以下是eval
命令的基本语法。
redis 127.0.0.1:6379> eval script numkeys key [key ...] arg [arg ...]
以下示例说明了redis脚本的工作原理。
redis 127.0.0.1:6379> eval "return {keys[1],keys[2],argv[1],argv[2]}" 2 key1
key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
redis中的连接命令基本上是用于管理与redis服务器的客户端连接。
以下示例说明客户端如何向redis服务器验证自身,并检查服务器是否正在运行。
redis 127.0.0.1:6379> auth "password"
ok
redis 127.0.0.1:6379> ping
pong
下表列出了与redis连接相关的一些基本命令。
序号 | 命令 | 说明 |
---|---|---|
1 | auth password | 使用给定的密码验证服务器 |
2 | echo message | 打印给定的字符串信息 |
3 | ping | 检查服务器是否正在运行 |
4 | quit | 关闭当前连接 |
5 | select index | 更改当前连接的所选数据库 |
redis服务器命令基本上是用于管理redis服务器。
以下示例说明了如何获取有关服务器的所有统计信息和信息。
127.0.0.1:6379> info
# server
redis_version:2.8.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:8f6097d7914679ca
redis_mode:standalone
os:linux 3.19.0-25-generic i686
arch_bits:32
multiplexing_api:epoll
gcc_version:4.8.2
process_id:1004
run_id:1e53acea2aa628199c4e438a3ed815d96eebc036
tcp_port:6379
uptime_in_seconds:888450
uptime_in_days:10
hz:10
lru_clock:1861984
config_file:/etc/redis/redis.conf
# clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# memory
used_memory:424872
used_memory_human:414.91k
used_memory_rss:6709248
used_memory_peak:424464
used_memory_peak_human:414.52k
used_memory_lua:22528
mem_fragmentation_ratio:15.79
mem_allocator:jemalloc-3.4.1
# persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1486607123
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
# stats
total_connections_received:1
total_commands_processed:263
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:257
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:4793
# replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# cpu
used_cpu_sys:24.65
used_cpu_user:15.84
used_cpu_sys_children:0.08
used_cpu_user_children:0.00
# keyspace
db0:keys=14,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
127.0.0.1:6379>
redis数据库可以使用安全的方案,使得进行连接的任何客户端在执行命令之前都需要进行身份验证。要保护redis安全,需要在配置文件中设置密码。
下面的示例显示了保护redis实例的步骤。
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
默认情况下,此属性为空,这表示还没有为此实例设置密码。您可以通过执行以下命令更改此属性。
127.0.0.1:6379> config set requirepass "h3"
ok
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "h3"
设置密码后,如果任何客户端运行命令而不进行身份验证,则会返回一个(error) noauth authentication required.的错误信息。 因此,客户端需要使用auth命令来验证。
以下是auth命令的基本语法。
127.0.0.1:6379> auth password
127.0.0.1:6379> auth "h3"
ok
127.0.0.1:6379> set mykey "test value"
ok
127.0.0.1:6379> get mykey
"test value"
redis在配置的监听tcp端口和unix套接字上等待和接受客户端的连接(如果已启用)。 当接受新的客户端连接时,执行以下操作 -
i/o
,因此客户端套接字处于非阻塞状态。tcp_nodelay
选项是为了确保连接不延迟。在redis配置文件(redis.conf
)中,有一个名称为maxclients
的属性,它描述了可以连接到redis的客户端的最大数量。
以下是命令的基本语法。
127.0.0.1:6379> config get maxclients
1) "maxclients"
2) "3984"
默认情况下,此属性设置为10000
(取决于操作系统的文件描述符限制的最大数量),但您可以更改此属性。
在以下示例中,我们已将客户端的最大数目设置为100000
,并启动服务器。
h3@ubuntu:~$ redis-server --maxclients 100000
编号 | 命令 | 描述 |
---|---|---|
1 | client list | 返回连接到redis服务器的客户端列表 |
2 | client setname | 为当前连接分配/设置新的名称 |
3 | client getname | 返回由client setname 设置的当前连接的名称 |
4 | client pause | 这是一个连接控制命令,能够将所有redis客户端按指定的时间量(以毫秒为单位)挂起 |
5 | client kill | 此命令关闭指定的客户端连接。 |
redis是一个tcp服务器,支持请求/响应协议。 在redis中,请求通过以下步骤完成:
管道的基本含义是,客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复。
要检查redis管道,只需启动redis实例,并在终端中键入以下命令。
$(echo -en "ping\r\n set tutorial redis\r\nget tutorial\r\nincr
visitor\r\nincr visitor\r\nincr visitor\r\n"; sleep 10) | nc localhost 6379
+pong
+ok
redis
:1
:2
:3
在上面的例子中,我们将使用ping命令检查redis连接。这里设置了一个名称为tutorial
的字符串,值为redis
。 然后得到键值,并增加 visitor
数量三次。 在结果中,我们可以看到所有命令都提交到redis一次,redis在一个步骤中提供所有命令的输出。
这种技术的好处是大大提高了协议性能。通过管道从连接到本地主机速度增加五倍,因特网连接的至少快一百倍。
分区是将数据拆分为多个redis实例的过程,因此每个实例只包含一部分键。
redis中有两种类型的分区。假设有四个redis实例:r0
,r1
,r2
,r3
以许多代表用户的键,如user:1
,user:2
,…等等。
范围分区通过将对象的范围映射到特定的redis实例来实现。假设在上面示例中,从id 0到id 10000的用户将进入实例r0
,而从id 10001到id 20000的用户将进入实例r1
,以此类推。
在这种类型的分区中,使用散列函数(例如,模函数)将键转换成数字,然后将数据存储在不同的redis实例中。
在java程序中使用redis之前,需要确保在机器上安装了redis的java驱动程序和java环境。可以先在将java电脑上并配置好环境。
现在,让我们看看如何设置redis java驱动程序。
jedis.jar
- http://repo1.maven.org/maven2/redis/clients/jedis/2.1.0/jedis-2.1.0-sources.jar ,确保下载的jedis.jar
是最新版本。jedis.jar
包含到类路径中。请参考以下一个简单的示例代码 -
import redis.clients.jedis.jedis;
public class redisjava {
public static void main(string[] args) {
//connecting to redis server on localhost
jedis jedis = new jedis("localhost");
system.out.println("connection to server sucessfully");
//check whether server is running or not
system.out.println("server is running: "+jedis.ping());
}
}
现在,编译并运行上面的程序来测试与redis服务器的连接。可以根据需要更改路径。假设jedis.jar
的当前版本在当前路径中可以使用。
执行上面代码,将生成以下结果 -
$javac redisjava.java
$java redisjava
connection to server sucessfully
server is running: pong
import redis.clients.jedis.jedis;
public class redisstringjava {
public static void main(string[] args) {
//connecting to redis server on localhost
jedis jedis = new jedis("localhost");
system.out.println("connection to server sucessfully");
//set the data in redis string
jedis.set("tutorial-name", "redis tutorial");
// get the stored data and print it
system.out.println("stored string in redis:: "+ jedis.get("tutorialname"));
}
}
执行上面代码,将生成以下结果 -
$javac redisstringjava.java
$java redisstringjava
connection to server sucessfully
stored string in redis:: redis tutorial
import redis.clients.jedis.jedis;
public class redislistjava {
public static void main(string[] args) {
//connecting to redis server on localhost
jedis jedis = new jedis("localhost");
system.out.println("connection to server sucessfully");
//store data in redis list
jedis.lpush("tutorial-list", "redis");
jedis.lpush("tutorial-list", "mongodb");
jedis.lpush("tutorial-list", "mysql");
// get the stored data and print it
list<string> list = jedis.lrange("tutorial-list", 0 ,5);
for(int i = 0; i<list.size(); i++) {
system.out.println("stored string in redis:: "+list.get(i));
}
}
}
执行上面代码,将生成以下结果 -
$javac redislistjava.java
$java redislistjava
connection to server sucessfully
stored string in redis:: redis
stored string in redis:: mongodb
stored string in redis:: mysql
import redis.clients.jedis.jedis;
public class rediskeyjava {
public static void main(string[] args) {
//connecting to redis server on localhost
jedis jedis = new jedis("localhost");
system.out.println("connection to server sucessfully");
//store data in redis list
// get the stored data and print it
list<string> list = jedis.keys("*");
for(int i = 0; i<list.size(); i++) {
system.out.println("list of stored keys:: "+list.get(i));
}
}
}
执行上面代码,将生成以下结果 -
$javac rediskeyjava.java
$java rediskeyjava
connection to server sucessfully
list of stored keys:: tutorial-name
list of stored keys:: tutorial-list
在php程序中使用redis之前,需要确保在机器上安装了redis的php驱动程序和php环境。可以先在将php电脑上并配置好环境。
现在,让我们看看如何设置redis php驱动程序。
从github库下载phpredis
=> http://github.com/nicolasff/phpredis。 当下载它之后,提取文件到phpredis
目录。在ubuntu上,安装以下扩展。
cd phpredis
sudo phpize
sudo ./configure
sudo make
sudo make install
现在,将“modules
”文件夹的内容复制并粘贴到php扩展目录中,并在php.ini
中添加以下行。
extension = redis.so
现在,redis php安装完成!
<?php
//connecting to redis server on localhost
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
echo "connection to server sucessfully";
//check whether server is running or not
echo "server is running: ".$redis->ping();
?>
当程序执行时,将产生以下结果。
connection to server sucessfully
server is running: pong
<?php
//connecting to redis server on localhost
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
echo "connection to server sucessfully";
//set the data in redis string
$redis->set("tutorial-name", "redis tutorial");
// get the stored data and print it
echo "stored string in redis:: " .$redis→get("tutorial-name");
?>
执行上面代码,将生成以下结果 -
connection to server sucessfully
stored string in redis:: redis tutorial
<?php
//connecting to redis server on localhost
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
echo "connection to server sucessfully";
//store data in redis list
$redis->lpush("tutorial-list", "redis");
$redis->lpush("tutorial-list", "mongodb");
$redis->lpush("tutorial-list", "mysql");
// get the stored data and print it
$arlist = $redis->lrange("tutorial-list", 0 ,5);
echo "stored string in redis:: ";
print_r($arlist);
?>
执行上面代码,将生成以下结果 -
connection to server sucessfully
stored string in redis::
redis
mongodb
mysql
<?php
//connecting to redis server on localhost
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
echo "connection to server sucessfully";
// get the stored keys and print it
$arlist = $redis->keys("*");
echo "stored keys in redis:: "
print_r($arlist);
?>
执行上面代码,将生成以下结果 -
connection to server sucessfully
stored string in redis::
tutorial-name
tutorial-list
前面我们已经准备成功开启redis服务,其端口号为6379,接下来我们就看看如何使用c#语言来操作redis。就如mongodb一样,要操作redis服务,自然就需要下载c#的客户端,这里通过nuget下载了“servicestack.redis”客户端,引入成功之后,就可以使用c#来对redis服务进行操作了。
由于redis一般是用来作为缓存的,也就是一般我们把一些不经常改变的数据通过redis缓存起来,之后用户的请求就不需要再访问数据库,而可以直接从redis缓存中直接获取,这样就可以减轻数据库服务器的压力以及加快响应速度。既然是用来做缓存的,也就是通过指定key值来把对应value保存起来,之后再根据key值来获得之前缓存的值。具体的操作代码如下所示,这里就不过多介绍了。
请参考以下代码 -
class program
{
static void main(string[] args)
{
//在redis中存储常用的5种数据类型:string,hash,list,setsorted set
var client = new redisclient("127.0.0.1", 6379);
//addstring(client);
//addhash(client);
//addlist(client);
//addset(client);
addsetsorted(client);
console.readline();
}
private static void addstring(redisclient client)
{
var timeout = new timespan(0,0,0,30);
client.add("test", "learninghard", timeout);
while (true)
{
if (client.containskey("test"))
{
console.writeline("string key: test -value: {0}, 当前时间: {1}", client.get<string>("test"), datetime.now);
thread.sleep(10000);
}
else
{
console.writeline("value 已经过期了,当前时间:{0}", datetime.now);
break;
}
}
var person = new person() {name = "learninghard", age = 26};
client.add("lh", person);
var cacheperson = client.get<person>("lh");
console.writeline("person's name is : {0}, age: {1}", cacheperson.name, cacheperson.age);
}
private static void addhash(redisclient client)
{
if (client == null) throw new argumentnullexception("client");
client.setentryinhash("hashid", "name", "learninghard");
client.setentryinhash("hashid", "age", "26");
client.setentryinhash("hashid", "sex", "男");
var hashkeys = client.gethashkeys("hashid");
foreach (var key in hashkeys)
{
console.writeline("hashid--key:{0}", key);
}
var haskvalues = client.gethashvalues("hashid");
foreach (var value in haskvalues)
{
console.writeline("hashid--value:{0}", value);
}
var allkeys = client.getallkeys(); //获取所有的key。
foreach (var key in allkeys)
{
console.writeline("allkey--key:{0}", key);
}
}
private static void addlist(redisclient client)
{
if (client == null) throw new argumentnullexception("client");
client.enqueueitemonlist("queuelistid", "1.learnghard"); //入队
client.enqueueitemonlist("queuelistid", "2.张三");
client.enqueueitemonlist("queuelistid", "3.李四");
client.enqueueitemonlist("queuelistid", "4.王五");
var queuecount = client.getlistcount("queuelistid");
for (var i = 0; i < queuecount; i++)
{
console.writeline("queuelistid出队值:{0}", client.dequeueitemfromlist("queuelistid")); //出队(队列先进先出)
}
client.pushitemtolist("stacklistid", "1.learninghard"); //入栈
client.pushitemtolist("stacklistid", "2.张三");
client.pushitemtolist("stacklistid", "3.李四");
client.pushitemtolist("stacklistid", "4.王五");
var stackcount = client.getlistcount("stacklistid");
for (var i = 0; i < stackcount; i++)
{
console.writeline("stacklistid出栈值:{0}", client.popitemfromlist("stacklistid")); //出栈(栈先进后出)
}
}
//它是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集
private static void addset(redisclient client)
{
if (client == null) throw new argumentnullexception("client");
client.additemtoset("set1001", "a");
client.additemtoset("set1001", "b");
client.additemtoset("set1001", "c");
client.additemtoset("set1001", "d");
var hastset1 = client.getallitemsfromset("set1001");
foreach (var item in hastset1)
{
console.writeline("set无序集合value:{0}", item); //出来的结果是无须的
}
client.additemtoset("set1002", "k");
client.additemtoset("set1002", "c");
client.additemtoset("set1002", "a");
client.additemtoset("set1002", "j");
var hastset2 = client.getallitemsfromset("set1002");
foreach (var item in hastset2)
{
console.writeline("set无序集合valueb:{0}", item); //出来的结果是无须的
}
var hashunion = client.getunionfromsets(new string[] { "set1001", "set1002" });
foreach (var item in hashunion)
{
console.writeline("求set1001和set1002的并集:{0}", item); //并集
}
var hashg = client.getintersectfromsets(new string[] { "set1001", "set1002" });
foreach (var item in hashg)
{
console.writeline("求set1001和set1002的交集:{0}", item); //交集
}
var hashd = client.getdifferencesfromset("set1001", new string[] { "set1002" }); //[返回存在于第一个集合,但是不存在于其他集合的数据。差集]
foreach (var item in hashd)
{
console.writeline("求set1001和set1002的差集:{0}", item); //差集
}
}
/*
sorted set 是set的一个升级版本,它在set的基础上增加了一个顺序的属性,这一属性在添加修改.元素的时候可以指定,
* 每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字.
*/
private static void addsetsorted(redisclient client)
{
if (client == null) throw new argumentnullexception("client");
client.additemtosortedset("setsorted1001", "a");
client.additemtosortedset("setsorted1001", "b");
client.additemtosortedset("setsorted1001", "c");
var listsetsorted = client.getallitemsfromsortedset("setsorted1001");
foreach (var item in listsetsorted)
{
console.writeline("setsorted有序集合{0}", item);
}
client.additemtosortedset("setsorted1002", "a", 400);
client.additemtosortedset("setsorted1002", "d", 200);
client.additemtosortedset("setsorted1002", "b", 300);
// 升序获取第一个值:"d"
var list = client.getrangefromsortedset("setsorted1002", 0, 0);
foreach (var item in list)
{
console.writeline(item);
}
//降序获取第一个值:"a"
list = client.getrangefromsortedsetdesc("setsorted1002", 0, 0);
foreach (var item in list)
{
console.writeline(item);
}
}
}
class person
{
public string name { get; set; }
public int age { get; set; }
}
如何要想查看自己操作是否成功,也可以像mongodb那样下载一个客户端工具,这里推荐一款redis desktop manager。这个工具就相当于sql server的客户端工具一样。通过这款工具可以查看redis服务器中保存的数据和对应格式。其使用也非常简单,只需要添加一个redis服务连接即可。该工具的下载地址为:http://pan.baidu.com/s/1sjp55ul