Redis简介
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map),列表(list),集合(sets)和 有序集合(sorted sets)等类型。
Redis安装
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz $ tar xzf redis-5.0.5.tar.gz $ cd redis-5.0.5 $ make
以后台方式启动Redis
修改Redis.conf文件
将daemonize no
修改为
daemonize yes
启动Redis
src/redis-server redis.conf
开机启动Redis
执行安装脚本,一直默认就可以
./utils/install_server.sh
mv /etc/init.d/redis_6379 /etc/init.d/redis
设置Redis密码
vim /etc/redis/6379.conf requirepass redispass service redis restart
再次连接发现需要输入密码
Redis命令
全局命令
获取键
keys pattern
keys还支持通配符
127.0.0.1:6379> set we "hello" OK 127.0.0.1:6379> keys * 1) "we" 127.0.0.1:6379> set name wanger OK 127.0.0.1:6379> keys name 1) "name" 127.0.0.1:6379> keys * 1) "name" 2) "we"
keys 命令遍历了Redis中所有的键,当键的数量过多时会影响Redis性能
删除键
del key1 key2 ..
例如:
127.0.0.1:6379> keys * 1) "qwe" 2) "asd" 3) "we" 127.0.0.1:6379> del asd qwe (integer) 2 127.0.0.1:6379> keys * 1) "we"
判断键是否存在
exists key1 key2
例如:
127.0.0.1:6379> exists we (integer) 1 127.0.0.1:6379> exists name (integer) 0 127.0.0.1:6379> set qwe 2 OK 127.0.0.1:6379> exists we qwe (integer) 2 127.0.0.1:6379> exists we name (integer) 1
获取键的总数
dbsize
例如:
127.0.0.1:6379> dbsize (integer) 2 127.0.0.1:6379> keys * 1) "qwe" 2) "we"
获取键的数据类型
type key
例如:
127.0.0.1:6379> type we string 127.0.0.1:6379> lpush list1 1 2 3 (integer) 3 127.0.0.1:6379> type list1 list
对列表、集合、有序集合的元素进行排序
sort key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
例如:
127.0.0.1:6379> lrange list 0 -1 1) "5" 2) "7" 3) "2" 4) "4" 5) "3" 6) "1" sort list desc limit 0 5 1) "7" 2) "5" 3) "4" 4) "4" 5) "3" 127.0.0.1:6379> lpush list2 asd qwe zxc (integer) 3 sort list2 desc limit 0 5 alpha 1) "zxc" 2) "qwe" 3) "asd"
清空数据库
flushdb //清空当前数据库 flushall //清空所有数据库
例如:
127.0.0.1:6379[11]> set a 1 OK 127.0.0.1:6379[11]> get a "1" 127.0.0.1:6379[11]> flushdb OK 127.0.0.1:6379[11]> get a (nil)
将指定的键移动到其他数据库
move key db
例如:
127.0.0.1:6379[11]> set a 1 OK 127.0.0.1:6379[11]> move a 2 (integer) 1 127.0.0.1:6379[11]> select 2 OK 127.0.0.1:6379[2]> get a "1"
字符串
字符串类型是Redis最基础的数据结构,字符串类型是其他几种数据类型的基础,他能存储任何形式的字符串,包括二进制数据
设值取值
set key value [EX seconds] [PX milliseconds] [NX|XX] get key
- nx:
键必须不存在,才可以设置成功,用于添加。 - xx:
与nx相反,键必须存在,才可以设置成功,用于更新
例如:
127.0.0.1:6379> set name wanger OK 127.0.0.1:6379> get name "wanger" 127.0.0.1:6379> setnx name wanger (integer) 0 127.0.0.1:6379> set name wang xx OK
批量设值取值
mset key1 value1 key2 value2 .. mget key1 key2
例如:
127.0.0.1:6379> mset key1 1 key2 2 OK 127.0.0.1:6379> mget key1 key2 1) "1" 2) "2"
对键值自增自减
incr key decr key
例如:
127.0.0.1:6379> incr key1 (integer) 2 127.0.0.1:6379> incr key2 (integer) 3 127.0.0.1:6379> get key1 "2" 127.0.0.1:6379> get key2 "3" 127.0.0.1:6379> get we "hello" 127.0.0.1:6379> incr we (error) ERR value is not an integer or out of range 127.0.0.1:6379> decr key1 (integer) 1 127.0.0.1:6379> decr key2 (integer) 2
追加值
append key value
例如:
127.0.0.1:6379> append key hello (integer) 5 127.0.0.1:6379> append key world (integer) 10 127.0.0.1:6379> get key "helloworld"
获取字符串长度
strlen key
例如:
127.0.0.1:6379> get key "helloworld" 127.0.0.1:6379> strlen key (integer) 10 127.0.0.1:6379> set name "王二" OK 127.0.0.1:6379> strlen name (integer) 6
设置和获取指定位置的字符串
setrange key offset value getrange key start end
例如:
127.0.0.1:6379> SET key1 "Hello World" OK 127.0.0.1:6379> setrange key1 6 "Redis" (integer) 11 127.0.0.1:6379> get key1 "Hello Redis" 127.0.0.1:6379> getrange key1 6 12 "Redis"
字符串对象编码
字符串类型的内部编码有3种:
- int:
8个字节的长整型。 - embstr:
小于等于39个字节的字符串。 - raw:
大于39个字节的字符串。
例如:
127.0.0.1:6379> set num 123456 OK 127.0.0.1:6379> object encoding num "int" 127.0.0.1:6379> set short qweasd OK 127.0.0.1:6379> object encoding short "embstr" 127.0.0.1:6379> set raw "when you love me I have lost of plot wow wow" OK 127.0.0.1:6379> object encoding raw "raw"
列表
Redis列表可以存储一个有序的字符串列表,内部使用双向链表实现,双向链表作为一种常见的数据结构,双向链表的每个数据节点都有两个指针,分别指向后继与前驱节点,从双向链表中的任意一个节点开始都可以很方便地访问其前驱与后继节点,因此获取越接近两端的元素就越快
从左右两边插入元素或者从某一个元素前后插入数据
lpush key value1 value2 value3 rpush key value1 value2 value3 linsert key BEFORE|AFTER pivot value
例如:
127.0.0.1:6379> lpush names 1 2 3 4 (integer) 4 127.0.0.1:6379> lrange names 0 4 1) "4" 2) "3" 3) "2" 4) "1" 127.0.0.1:6379> rpush nums 1 2 3 4 (integer) 4 127.0.0.1:6379> lrange nums 0 4 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> linsert nums before 2 5 (integer) 5 127.0.0.1:6379> lrange nums 0 5 1) "1" 2) "5" 3) "2" 4) "3" 5) "4"
从列表两端删除元素
lpop key rpop key
例如:
127.0.0.1:6379> lrange nums 0 5 1) "1" 2) "5" 3) "2" 4) "3" 5) "4" 127.0.0.1:6379> lpop nums "1" 127.0.0.1:6379> rpop nums "4" 127.0.0.1:6379> lrange nums 0 5 1) "5" 2) "2" 3) "3"
获取给定位置上的元素
lindex key index
例如:
127.0.0.1:6379> lrange nums 0 5 1) "5" 2) "2" 3) "3" 127.0.0.1:6379> lindex nums 2 "3" 127.0.0.1:6379> lindex nums 1 "2" 127.0.0.1:6379> lindex nums -1 "3"
获取给定范围的元素
lrange key start stop
例如:
127.0.0.1:6379> lrange nums 0 1 1) "5" 2) "2" 127.0.0.1:6379> lrange nums 0 2 1) "5" 2) "2" 3) "3"
获取列表长度
llen key
例如:
127.0.0.1:6379> lrange nums 0 3 1) "5" 2) "2" 3) "3" 127.0.0.1:6379> llen nums (integer) 3
从列表中删除值
lrem key count value
- count > 0:
删除数量为count的从头到尾移动的值为value的元素。 - count < 0:
删除数量为count的从尾到头移动的值为value的元素。 - count = 0:
删除所有等于value的元素。
例如:
127.0.0.1:6379> lrange mylist 0 10 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "2" 7) "3" 8) "4" 9) "5" 10) "5" 127.0.0.1:6379> lrem mylist 1 5 (integer) 1 127.0.0.1:6379> lrange mylist 0 10 1) "1" 2) "2" 3) "3" 4) "4" 5) "2" 6) "3" 7) "4" 8) "5" 9) "5" 127.0.0.1:6379> lrem mylist -2 5 (integer) 2 127.0.0.1:6379> lrange mylist 0 10 1) "1" 2) "2" 3) "3" 4) "4" 5) "2" 6) "3" 7) "4" 127.0.0.1:6379> lrem mylist 0 2 (integer) 2 127.0.0.1:6379> lrange mylist 0 11 1) "1" 2) "3" 3) "4" 4) "3" 5) "4"
修改指定索引的元素
lset key index value
例如:
127.0.0.1:6379> lrange mylist 0 6 1) "1" 2) "3" 3) "4" 4) "3" 5) "4" 127.0.0.1:6379> lset mylist 1 5 OK 127.0.0.1:6379> lrange mylist 0 6 1) "1" 2) "5" 3) "4" 4) "3" 5) "4"
阻塞操作
blpop和brpop分别是lpop和rpop的阻塞版本,功能类似,当列表为空时,会发生阻塞,timeout可定义阻塞时间,timeout为0时将一直阻塞,直到在另一个客户端中往列表中加入元素
blpop key1 key2 timeout brpop key1 key2 timeout
例如:
127.0.0.1:6379> lrange list2 0 4 1) "4" 2) "3" 3) "2" 127.0.0.1:6379> lrange list1 0 4 1) "8" 2) "7" 127.0.0.1:6379> blpop list1 list2 0 1) "list1" 2) "8" 127.0.0.1:6379> brpop list1 list2 0 1) "list1" 2) "7" 127.0.0.1:6379> brpop list1 list2 0 1) "list2" 2) "2" 127.0.0.1:6379> brpop list1 list2 0 1) "list2" 2) "3" 127.0.0.1:6379> brpop list1 list2 0 1) "list2" 2) "4" 127.0.0.1:6379> brpop list1 list2 0 1) "list2" 2) "1" (18.49s) 在另一个客户端执行 127.0.0.1:6379> lpush list2 1 (integer) 1
列表内部编码
- ziplist(压缩列表):
列表元素保存的所有字符串元素的长度都小于64字节且元素数量小于512个时使用ziplist编码 - linkedlist(链表):
当列表类型无法满足两个条件的任意一个的时候,redis会使用linkedlist作为列表的内部实现 - quicklist:
list的内部实现quicklist是一个ziplist的双向链表,双向链表是由多个节点(Node)组成的,quicklist的每个节点都是一个ziplist。