Redis基础入门

Redis快速入门

Redis简介

Redis全称为REmote DIctionary Server,即远程的字典服务,是一个使用ANSI C语言编写的开源数据库,其主要特点是

  1. 是一个高性能的key-value数据库
  2. 是一个内存数据库,支持数据的持久化

Redis相关网站

Redis的官方网站地址为Redis官网,其中国官网为Redis中国。官网提供了JavaC\C++C#PHPJavaScriptPerlObject-CPythonRubyErlang等语言的客户端。对于Java语言来说,存在多种客户端,实际开发过程中,比较常用的是一种被称为Jedis的客户端。

Redis常用数据类型

Redis常用的数据类型主要有5种

  • string(字符串)
  • list(链表)
  • set(无序集合)
  • sorted set(有序集合)
  • hash(哈希)

Redis版本说明

Redis官方并没有提供Redis的Windows版本,其Windows下的版本由Microsoft Open Tech group维护,可点击链接Redis的Windows版本下载。

Redis安装与启动

现在,我们开始在Windows 7平台下安装Redis,访问前面一节中的Redis下载地址,下载名称为Redis-x64-2.8.2402.zip的压缩包。

Redis解压缩完成安装

下载完成后,将该压缩包移动到适当的目录下解压缩即可完成安装。此时,我们启动两个cmd窗口,分别执行服务端启动以及客户端连接,先来看一下单实例Redis情况下的相关启动关闭命令。

Redis单实例服务端启动

  1. 直接执行命令:redis-server
  2. 指定配置文件启动:redis-server ${redis.conf}
  3. 指定端口启动:`redis-server --port ${port}

Redis单实例客户端启动

  1. 直接执行命令:redis-cli
  2. 指定端口启动客户端连接:redis-cli -p ${port}
  3. 指定ip启动客户端连接:redis-cli-h ${ip}
  4. 输入密码启动客户端连接:redis-cli -a ${password}

Redis单实例服务端及客户端关闭

在客户端执行quit命令后,再按实际情况执行关闭命令

  1. 执行命令关闭默认端口服务:redis-cli shutdown
  2. 指定端口关闭服务:redis-cli -p ${port} shutdown
  3. 指定ip关闭服务:redis-cli -h {ip} shutdown

注意:若Redis服务端不采用默认方式启动,则客户端启动和关闭时要指定相关参数。例如:服务端执行6380端口启动,则客户端启动和关闭也要指定相同的端口,其余情况类似

Redis单实例环境验证

  1. 在打开客户端的cmd下执行命令:ping,若返回PONG,则服务正常启动
  2. 执行redis set命令,使用redis get命令获取到值。若一切正常,则服务正常启动

Redis服务端和客户端启动

  1. 启动cmd,切换到解压缩的Redis根目录下,输入redis-server.exe命令启动Redis服务端,若启动成功,则显示如下信息

Redis服务端启动

可以看到,Redis服务的进程ID为7444,端口号为6379。

  1. 然后,我们再打开一个cmd窗口,和前面一样,我们进入Redis的根目录,输入redis-cli,然后输入set a b并回车此时返回OK,再输入keys *,此时返回键”a”,接着,输入get a,得到键a的值”b”

Redis客户端启动

接着,客户端cmd再输入命令set x x回车,再输入命令get x,返回键x的值”x”。输入命令keys *,返回两个键”x”和“a”。

keys查询

通过上述操作的验证,我们确定Redis服务和客户端连接正常。

Redis基础命令

Redis基础命令作用说明

Redis基础命令主要是一些系统级别的命令。本节先介绍介绍6个常用的命令,其作用如下

  • info命令:该命令会罗列出Redis服务端,客户端等系统参数,结果如下
  • flushdb命令:清除当前数据库的数据
  • flushall命令:清除所有数据库的数据
  • dbsize命令:返回当前数据库的key的数量
  • save命令:人工触发对Redis数据持久化
  • quit命令:退出客户端连接

命令应用实例

通过上面的说明,我们对Redis基础命令有了一定的了解。接下来,我们来实际操作一遍。首先,我们先在客户端cmd输入命令info,得到如下结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Server
redis_version:2.8.2402
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:b2a45a9622ff23b7
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:winsock_IOCP
process_id:8388
run_id:16295d3cba108dc92e8aeb13543f7f0cc931ca5b
tcp_port:6379
uptime_in_seconds:608
uptime_in_days:0
hz:10
lru_clock:10029495
config_file:D:\Redis-x64-2.8.2402\redis.windows.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:953168
used_memory_human:930.83K
used_memory_rss:919520
used_memory_peak:953168
used_memory_peak_human:930.83K
used_memory_lua:36864
mem_fragmentation_ratio:0.96
mem_allocator:dlmalloc-2.8
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1536755543
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
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
aof_last_write_status:ok
# Stats
total_connections_received:1
total_commands_processed:0
instantaneous_ops_per_sec:0
total_net_input_bytes:14
total_net_output_bytes:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
# 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:0.06
used_cpu_user:0.08
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Keyspace
db0:keys=2,expires=0,avg_ttl=0

注意到最后一个配置Keyspace,其db0有2个key。打开Redis根目录下的redis.windows.conf文件,找到下面一段话,可以看到数据库数量默认有16个,其dbId介于0到数据库数量减1,且其默认的数据库为db0

1
2
3
4
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

现在,我们使用命令select 1切换到另一个dbId为1的数据库,输入命令keys *,返回提示(empty list or set),表明该数据库没有数据。然后,我们输入命令set 1 1并回车,再次使用命令info查看Redis相关信息,可以发现最后一项Keyspace增加了db1的内容。

1
2
3
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0

现在,我们想清除db1的数据。执行flushdb命令,使用命令keys *查询数据,可以看到(empty list or set)提示,此时执行info命令, 则当前结果显示,db1的内容已经不存在了。

1
2
# Keyspace
db0:keys=2,expires=0,avg_ttl=0

我们还想清除db1的数据,可以运行flushall命令,再次执行info命令后发现Keyspace没有内容了

1
# Keyspace

执行dbsize命令,查看当前数据库的key数量,结果为0

Redis 键命令

Redis键命令作用说明

Redis中,键命令是用于管理Redis各种键值对的命令。本节,我们学习8个命令

  • del命令:删除指定键,若成功返回1,否则返回0,其命令格式为del key
  • exists命令:判断指定键是否存在,存在返回1,否则返回0,其命令格式为exists key
  • ttl命令:查看key的剩余生存时间(单位是秒),若返回-1,表示无过期时间,若返回-2,则表示该键不存在,其命令格式为ttl key
  • expire命令:设置键的过期时间,其命令格式为expire key time
  • randomkey命令:产生随机key,直接执行randomkey即可
  • rename命令:用于重命名一个key,若key已经存在,则覆盖原有存在的key,其命令格式为rename key newkey
  • renamenx命令:若将某个key名称重命名为一个已经存在的key,返回0,重命名不成功,其命令格式为renamenx key newkye
  • type命令:返回key存储的值类型,其命令格式为type key
  • keys命令:查找所有符合给定模式( pattern)的 key,其命令格式为keys pattern。常用的形式为keys *,该命令会列出所有key

命令应用实例

  1. 首先,先执行命令set test test,再执行命令keys *,此时输出”test”。
  2. 其次,我们删除键test,执行命令del test,此时返回“OK”,表示键test被成功删除
  3. 然后,执行命令set a aset b b创建两个键值对,执行命令ttl a,返回-1,表示该键没有过期时间,执行expire a 10,表示设置该键的过期时间为10秒,不断执行命令ttl a,当返回-2时,表示该键已经过期,不存在了。
  4. 接着,我们重命名键a,执行命令rename a m,将键a改为键m,此时执行命令get m,取得原键a的值”a”
  5. 最后,我们执行命令renamenx m b,由于该键b已经存在,返回0,重命名失败。而如果使用rename a b则会将原来的键b覆盖掉,此时执行命令get b,返回结果“a”

Redis数据类型

前面说过,Redis有5种常用的数据类型,下面就一一介绍各种数据结构的主要命令

字符串(string)

StringRedis最基础的数据类型,一个key对应一个 value。可以包含任何数据。

命令 说明 示例
set key value 设置字符串的值 set a a,set word wordword
setex key time value 设置字符串值的同时设置过期时间(单位:秒) setex c 100 c
psetex key time value 设置字符串值的同时设置过期时间(单位:毫秒) psetex d 10000 d
get key 获取字符串名称为key的值,若key不存在,则返回nil,表示不存在 get e
getrange key begin end 截取获取名称为key的字符串,起始从0开始 getrange word 0 1,返回wo
getset key newValue 获取名称为key的字符串,并设置新值,返回字符串旧值 getset a aa,返回”a”
mset key1 value1 key2 value2… 批量设置多个key-value对 mset a1 a1 b1 b1
mget key1 key2… 批量获得多个名称为key的value的值 mget a1 b1
setnx key value 这个命令会判断key是否已经存在,若已经存在,则设置字符串的值失败,返回0,否则成功,返回1 setnx a newvalue失败,setnx newvalue newvalue成功
strlen key 计算字符串长度,返回字符串长度
msetnx key1 value1 key2 value2 批量设置多个key-value对 ,只要多个当中的其中一个key设置value失败,则返回0,否则返回空 msetnx nn nn uu uu
incr key 若值为数值型,可以使用该命令实现递增 set 1 1; incr 1得到2,以此类推
incrby key step 该命令可以设置步长,按步长大小递增 incrby 1 100得到102
decr key 若值为数值型,可以使用该命令实现递减
decrby key step 该命令可以设置步长,按步长大小递减
append key stringvalue 追加字符串 append a world;返回追加后新字符串的长度

哈希(hash)

哈希(hash)是一个键值(key=>value)对集合。哈希(hash)是一个string类型的field和value的映射表,特别适合用于存储对象 。

命令 说明 实例
hset key field value 设置hash的key及其field value的值 hset map name jim,hset age 18
hexists key field 查看key下的field是否存在,若不存在返回0,存在返回1 hexists map name 返回1
hget key field 可以获取field的value值 hget map name得到值“jim”
hgetall key 获取key中的所有值 hgetall map返回“name” “jim” “age” “18”
hkeys key 获取key中的所有field hkeys map返回“name” “age”
hvals key 获取key中的所有value hvals map返回“jim” “18”
hlen key 获取key中field数量 hlen map返回2
hmget key field1 field2 获取多个field对应的value hmget map name age返回“jim” “18”
hmset key field1 value1 field2 value2 批量设置key的多个field-value
hdel field1 field2 批量删除多个field
hsetnx key field value 若field存在,则设置value值失败

列表(list)

列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

命令 说明 示例
lpush key value1 value2 value3 给名称为key的列表添加多个值 lpush list 1 2 3 4
llen key 获取列表长度 llen list得到4
lrange key begin end 获取名称为key的列表多个值,越后面push的index值越小 lrange list 0 1,得到“4” “3”
lset KEY index value 设置列表中INDEX对应的值 lset list 0 50
lindex key index 获取列表中对应索引的值 lindex list 0 ,得到50
lpop KEY 移除列表中索引最小的value lpop list ,移除50
rpop KEY 移除列表中索引最大的value rpop list,移除1

集合(set)

RedisSetString类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)

命令 说明 示例
sadd key member1 member2 给集合添加元素,若元素已经存在,则添加失败 sadd set1 a b c d,sadd set2 e f c d
scard key 获取集合元素数量
smembers key 获取集合元素 smembers set1,返回“a” “b” “c” “d”
sdiff key1 key2 获取两个集合的差集 sdiff set1 set2返回 “a” “b”,sdiff set2 set1返回 “e” “f”
sinter key1 key2 获取两个集合的交集 sinter set1 set2返回”c” “d”
sunion key1 key2 获取两个集合的并集 sunion set1 set2返回”a” “b” “c” “d” “e” “f”
srandmember key number 获取集合中任意number个元素
sismember key member 判断value是否是该集合的元素,是则返回1,否则返回0
srem key member1 member2 移除集合中的一个或多个元素 srem set1 a b返回”c” “d”
spop key 移除集合中的任意一个元素并返回被移除的元素 spop set1 返回”c”或“d”

有序集合(sorted set)

有序集合(sorted set)和集合(set) 一样也是String类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合(sorted set)的成员是唯一的,但分数(score)却可以重复

命令 说明 示例
zadd key score1 member1 score2 member2 给有序集合添加元素,元素在集合中存在则更新对应score zadd sortedset1 100 a 200 b 300 c
zcard key 获取有序集合元素个数 zcard sortedset1返回3
zscore key member 返回member的值 zscore sortedset1 a返回100
zcount key value1 value2 返回有序集合中value值介于value1和value2之间的数 zcount sortedset1 0 220返回2
zrank key member 返回有序集合member的索引值 zrank sortedset1 a返回0
zincrby key step member 按给定的步长让有序集合中的member的值递增 zincrby sortedset1 1000 a返回1100
zrange key begin end withscores 获得有序集合索引值从begin到end的元素 zrange sortedset1 0 100返回“b” “200” “a” “100” “c ” “1100”

Redis报错解决

启动Redis时,可能会报如下错误

The Windows version of Redis allocates a memory mapped heap for sharing with

`the forked process used for persistence operations. In order to share this

memory, Windows allocates from the system paging file a portion equal to the

size of the Redis heap. At this time there is insufficient contiguous free

space available in the system paging file for this operation (Windows error

0x5AF). To work around this you may either increase the size of the system

paging file, or decrease the size of the Redis heap with the –maxheap flag.

Sometimes a reboot will defragment the system paging file sufficiently for

this operation to complete successfully.

Please see the documentation included with the binary distributions for more

details on the –maxheap flag

大概意思是:没有足够的可用空间,可以增加系统的大小分页文件,或减少Redis的堆的大小

使用–maxheap标志。

解决办法:重启一下电脑或者是在启动的时候配置内存

具体操作:在根目录下执行命令redis-server.exe redis.windows.conf --maxheap 200m