前言:
redis是一个key-value的存储系统,value支持string、list、set、zset、hash五种类型,且支持数据的本地存储
一、安装redis
前提:linux下需要安装了make、gcc、tcl 8.5。
下载地址:http://download.redis.io/releases/redis-3.0.6.tar.gz
进入要安装的位置,直接下载下来就,然后解压,进行编译即可。(我是在/opt下新建了一个目录redis,然后下载到这个目录里)
下载命令:wget http://download.redis.io/releases/redis-3.0.6.tar.gz
解压命令:tar -zxvf redis-3.0.6.tar.gz
具体命令如下:
cd /opt
mkdir redis
cd redis
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar -zxvf redis-3.0.6.tar.gz
cd redis-3.0.6
make
cd src
make install
如果遇到没有安装gcc或者tcl8.5的问题,可以参照下面两篇博客,注:我用的是Ubuntu系统
安装gcc:http://www.cnblogs.com/zhuyp1015/p/3533613.html
安装tcl8.5:http://www.41443.com/HTML/DB2/20150525/373733.html
二、redis结构,配置redis
1.redis结构,redis的可执行文件有如下四个:
redis-server:redis服务器的daemon启动程序,默认在前台启动
redis-cli:redis命令行操作工具
redis-benchmark:redis性能测试工具
redis-stat:redis状态监测工具(这个我装的默认不带这个工具,需要自己去单独安装)
2.redis启动
2.1启动redis-server (默认daemonize为no ,会在前台执行,可更改redis.conf文件来修改配置)
./redis-server
2.2启动redis-cli,启动成功后可以进行命令行操作了
./redis-cli
说明:redis-server默认是在前台启动的,是根据配置文件redis.conf中的配置进行启动的,这是要启动redis-cli就需要再开一个终端进行操作,所以可以修改redis.conf的daemonize为yes
3.redis.conf配置文件
1.redis.conf文件位置
安装redis的目录下
2.redis.conf的主要配置项
- daemonize:是否以后台daemon方式运行
- pidfile:pid文件位置
- port:监听的端口号
- timeout:请求超时时间
- loglevel:log信息级别
- logfile:log文件位置
- databases:开启数据库的数量
- save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
- rdbcompression:是否使用压缩
- dbfilename:数据快照文件名(只是文件名,不包括目录)
- dir:数据快照的保存目录(这个是目录)
- appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
- appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
将daemonize参数改为yes,这样就可以在后台运行server,而不用再开一个终端去执行./redis-cli了
修改配置文件后的server启动命令:./redis-server ../redis.conf
说明:./redis-server(进入src目录,执行当前目录下的redis-server),然后使用上一目录下的redis.confi配置文件启动
也可以设置启动脚本去启动redis,这个可以自行去百度
三、redis.cli命令
启动redis-server后,才可以启动redis-cli
启动命令:redis-cli
针对redis的命令:
(redis可以有多个数据库,每个数据库有索引编号,从0开始)
命令 | 意义 |
keys * | 查看redis下所有的key(*可以是一个正则表达式) |
exists key | redis下是否存在key |
type key | 获得key的value的类型(string等) |
del key | 删除key |
rename oldkey newkey | 将oldkey更名为newkey(如果newkey存在,则先将newkey删除) |
dbsize | 返回redis下key的数量 |
select index | 切换数据库(默认是0,如果切换1等后面会多一个【1】的标识) |
move key index | 将当前数据库下的key移动到索引为index的数据库下 |
flushdb | 删除当前数据库中的所有key |
flushall | 删除所有数据库中的key |
string类型的操作:
如果想删除string类型的,就直接删除key就可以了
操作 | 命令 | 例子 | 例子结果 |
增加或更改key,value | set key value | set key1 value1 | key1的值是value1 |
获得key的值 | get key | get key1 | value1 |
批量返回多个key的value | mget key1 key2 | 同命令 | 获得key1和key2的值 |
批量给多个key复制 | mset key1 value1 key2 value2 | 同命令 | 分别赋给key1、key2的value为value1、value2 |
给为数值的value+1 | incr key | key为1时,使用左侧命令 | 2 |
给为数值的value增加n(n为数字) | incrby key n | key为2时,incry key 2 | 4 |
给为数值的value-1 | decr key | key为2时,使用左侧命令 | 1 |
给为数值的value减去n(n为数字) | decrby key n | key为4时,decrby key 2 | 2 |
在string的value后追加内容 | append key value | key为abc时,append key de | key的value变为abcde |
获得value的子串 | substr key start end | key为1234567,substr key 1 3 | 获得key的子串234(子串索引从0开始计算) |
list类型的操作:
(list的索引是从0开始计算的)list底层用的是链表
操作 | 命令 | 例子 | 例子结果 |
向list型的value尾部增加一个值 | rpush key value1 value2 | rpush key1 abc | key1的尾部增加了一个子项“abc” |
向list型的value头部增加一个值 | lpush key value1 value2 | lpush key1 123 | key1的头部增加了一个子项“123” |
查询list的长度 | llen key | key1有3个子项,llen key1 | 3 |
查询key的值 | lrange key start end | key有3个子项“123”,“abc”,“cde” lrange key 0 -1 |
将全部子项都查询出来了,也可以用0 2的区间等查询部分结果 |
截取key的值,保留部分区间的值(索引) | ltrim key start end | ltrim key 0 1 | 只保留了key的0位和1位的值,截取了 |
获得某个索引位置的值 | lindex key index | lindex key 1 | 获得了索引为1位置的值 |
修改某索引位置的值 | lset key index value | lset key 1 abcdef | 将索引为1位置的值替换成了“abcdef” |
删除key下的某一个value | lrem key count value | lrem key 1 value | 删除count个值为value的数据,如果count为0,则所有为value的数据都删除 |
删除list值中的首元素 | lpop key | 同命令 | 第一个元素被删除 |
删除list值中的尾元素 | rpop key | 同命令 | 最后一个元素被删除 |
删除key1中的尾元素,并插到key2中头部 | rpoplpush key1 key2 | 同命令 | key1的尾元素被删除,并添加到了key2的头元素位置 |
set类型的操作:
是一种集合,是无序的集合,没有先后顺序,可以进行交集、并集、差集等操作,set类型的元素不会出现重复元素,元素唯一。
操作 | 命令 | 例子 | 例子结果 |
增加或更改set的key,value | sadd key value1 value2 | sadd key1 1 2 3 | key1的值是1,2,3(可以写多个值) |
返回set的所有元素 | smembers key | 同命令 | 返回key为key的所有元素 |
查询set下是否存在某一个元素 | sismember key member | sismember key1 5 | 查询key1下是否有5(返回的是1和0,1表示存在) |
删除set中的一个member | srem key member | srem key1 5 | 删除key1下为5的元素 |
随机删除set下的一个元素,并返回这个值 | spop key | 同命令 | 随机删除key下的一个元素 |
返回key下的元素个数 | scard key | 同命令 | 返回key为key的元素个数 |
从一个set下把某一元素移动到另一set下 | smove key2 key3 member | 同命令 | 将key2下的member移动到key3下 |
求多个set的交集 | sinter key1 key2 | 同命令 | 显示key1和key2下的交集 |
将多个set的交集存储到一个set下 | sinterstore key3 key1 key2 | 同命令 | 求key1和key2的交集并存储到key3下 |
求多个set的并集 | sunion key1 key2 | 同命令 | 显示key1和key2的并集 |
将多个set的并集存储到一个set下 | sunionstore key3 key1 key2 | 同命令 | 求key1和key2的并集并存储到key3下 |
求多个set的差集 | sdiff key1 key2 | 同命令 | 显示key1和key2的差集 |
求多个set的差集存储到一个set下 | sdiffstore key3 key1 key2 | 同命令 | 求key1和key2的差集并存储到key3下 |
随机返回set下的一个元素 | srandmember key | 同命令 | 随机返回key下的一个元素 |
zset类型的操作:
有序集合,每个元素都关联一个序号,元素去重。zset的命令都是以z开头的。zset的value由score(序号)和值两部分组成
操作 | 命令 | 例子 | 例子结果 |
增加zset的key和value | zadd key score member | zadd key 1 abc | 增加key下的序号为1的值为abc |
返回zset下某一member的index (元素按score从小到大排序) |
zrank key member | zrank key abc | 返回元素名为abc的索引(索引是从0开始计算的,所以比自己加的score少1) |
返回zset下某一member的index (元素按score从大到小排序) |
zrevrank key member | zrevrank key abc | 返回元素名为abc的索引(索引是从0开始计算的,所以比自己加的score少1) |
返回zset下某一区间的值 (元素按score从小到大排序0 |
zrange key start end | zset key 0 -1 | 返回zset下区间start到end的值(0 -1是全部) 元素从小到大排序 |
返回zset下某一区间的值 (元素按score从小到大排序) |
zrevrange key start end | zset key 0 -1 | 返回zset下区间start到end的值(0 -1是全部) 元素从小到大排序 |
删除zset下的某一个member | zrem key member | 同命令 | 删除key下的member |
返回zset某一元素的score | zscore key member | 同命令 | 返回key下元素member的score |
返回zset某一score区间的元素 | zrangebyscore key start end | zrangebyscore key 1 4 | 返回key下的score为1到4的元素 |
删除zset某一score区间的元素 | zremrangebyscore key start end | zremrangebyscore key 1 2 | 删除key下score区间为1到2的元素 |
zset还支持并集、交集、差集的计算,会根据最后的aggregate来决定score是sum还是min或max
hash类型的操作:
hash就是哈希,可以理解为map,一个key对value的类型。hash类型的数据组成key:{field:value}
hash的命令都是以h开头的,后面跟着redis的key,再后面的参数与string类型的操作类似,可以将hash的field想象成string的key。
操作 | 命令 | 例子 | 例子结果 |
hash插入数据 | hset key field value | hset key1 age 20 | 在key1下增加了一个age:20的hash值 |
获得hash中某一个field对应的value值 | hget key field | hget key age | 获得key下的age的值 |
批量获得hash的多个field对应的值 | hmget key field1 field2 | hmget key name age | 批量获得key下的name和age的值 |
hash批量插入数据 | hmset key field1 value1 field2 value2 | hmset key name tom age 20 | 批量插入key的value,name:tom age:20 |
查看hash的某一个key下是否存在field | hexists key field | hexists key name | 查看key下是否存在field叫做name的项 |
返回hash的元素个数 | hlen key | 同命令 | 返回key的元素个数 |
根据field,删除hash的某一个元素 | hdel key field | 同命令 | 删除key下键为field的元素 |
显示hash中所有的键及对应的值 | hgetall key | 同命令 | 显示key下所有的键及对应的值(但是是分行显示的) |
返回hash的所有元素的键 | hkeys key | 同命令 | 返回key下的所有元素的键(field) |
显示hash中所有键对应的值 | hvals key | 同命令 | 返回key下的所有键对应的值,不包含键 |
将hash下某一键的值增加一定数值 | hincrby key field integer | hincrby key field 10 | 将key的field的值增加10(如果值是数值会直接加10; 如果不是数值,该键的值会直接变为100 |
其他:redis还有很多其他的命令,如果有需要可以再去百度一下。redis还支持持久化的本地存储,和主从的搭建等。这些以后我有时间了会再补充一下。这篇就先暂时写到这里了