数据库 Redis Redis入门教程 王先森 2021-08-06 2021-08-06 Redis介绍 Redis是当前比较热门的NOSQL系统之一,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis特点 速度快 1 2 3 4 Redis所有的数据都存放在内存中; Redis使用C语言实现; Redis使用单线程架构; Redis读取的速度是110000次/s,写的速度是81000次/s。
基于键值对的数据结构服务器 1 支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
丰富的功能 1 2 3 提供了键过期功能,可以实现缓存; 提供了发布订阅功能,可以实现消息系统; 提供了pipeline功能,客户端可以将一批命令一次性传到Redis,减少了网络开销。
客户端语言多 1 java,PHP,python,C,C++,Nodejs等
持久化,主从复制(集群) Redis应用场景 缓存-键过期时间 1 2 缓存session会话 缓存用户信息,找不到再去mysql查,查到然后回写到redis
排行榜-列表&有序集合 计数器应用-天然支持计数器 社交网络-集合 安装部署Redis 环境准备 1 2 3 4 5 6 7 8 # /server/tools # /opt/redis_cluster/redis_{PORT}/{conf,logs,pid} # /data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb # /server/scripts/redis_shell.sh
安装Redis 1 2 3 4 5 6 7 8 9 10 mkdir /server/tools mkdir -p /data/redis_cluster/redis_6379 mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs} cd /server/tools wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/ ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis cd /opt/redis_cluster/redis make && make install
配置文件说明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # daemonize yes # bind 100.1.1.11 127.0.0.1 # port 6379 # pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log # databases 16 # dbfilename redis_6379.rdb # dir /data/redis_cluster/redis_6379
服务启动 启动 1 [root@redis01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
关闭 1 [root@redis01 ~]# redis-cli shutdown
Redis基本操作命令 全局命令 Redis有5种数据结构,他们是键值对中的值,对于键来说有一些通用的命令. 1.查看所有命键
十分危险的命令,线上禁止使用 2.查看键的总数
1 2 Dbsize # dbsize 命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量.
3.检查键是否存在
1 2 Exists key # 如果键存在则返回1,不存在则返回0
4.删除键
通用命令,无论值是什么数据结构类型,del命令都可以将其删除. 5.键过期
1 2 3 4 5 6 Expire key seconds # Redis支持对键添加过期时间,当超过过期时间后,会自动删除键. # 通过ttl命令观察键的剩余时间 大于等于0的证书: 键剩余过期时间 -1: 键没设置过期时间 -2: 键不存在
6.键的数据类型
字符串 Redis并不是简单地key-value存储,实际上他是一个数据结构服务器,支持不同类型的值. Redis Strings 这是最简单的Redis类型,如果你只用这种类型,Redis就像一个持久化的memcache服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失.) 操作命令: 通常用SET command 和 GET command来设置和获取字符串值 实例:
1 2 3 4 5 redis01:6379> set key1 value1 OK redis01:6379> get key1 "value1" redis01:6379> keys *1) "key1"
INCR命令将字符串值解析成整型.将其加1,最后结果保存为新的字符串,类似命令: INCRBY,DECR,DECRBY 实例:
1 2 3 4 5 6 7 8 9 10 11 12 redis01:6379> set key2 100 OK redis01:6379> get key2 "100" redis01:6379> incr key2 (integer) 101 redis01:6379> get key2 "101" redis01:6379> incrby key2 10 (integer) 111 redis01:6379> get key2 "111"
MSET和MGET可以一次存储或获取多个key对应的值。 实例:
1 2 3 4 5 6 redis01:6379> mset key3 v3 key4 v4 key5 v5 OK redis01:6379> mget key3 key4 key5 1) "v3" 2) "v4" 3) "v5"
EXISTS命令返回1或0标识给定key的值是否存在.使用DEL命令可以删除key对应的值,DEL命令返回1或0标识是被删除(值存在)或者没被删除(key对应的值不存在)。 实例:
1 2 3 4 5 6 7 8 redis01:6379> exists key5 (integer) 1 redis01:6379> del key5 (integer) 1 redis01:6379> exists key5 (integer) 0 redis01:6379> del key5 (integer) 0
Type命令可以返回key对应的存储类型 实例:
1 2 3 4 redis01:6379> set key5 v5 OK redis01:6379> type key5 string
可以对key设置一个超时时间,当这个时间到达后被删除 实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 redis01:6379> get key5 "v5"redis01:6379> ttl key5 (integer) -1 redis01:6379> expire key5 10 (integer) 1 redis01:6379> ttl key5 (integer) 6 redis01:6379> ttl key5 (integer) 5 redis01:6379> ttl key5 (integer) 2 redis01:6379> ttl key5 (integer) -2 redis01:6379> ttl key5 (integer) -2 redis01:6379> get key5 (nil)
PERSIST命令去除超时时间。 实例:
1 2 3 4 5 6 7 8 9 10 redis01:6379> set key5 v5 ex 10 OK redis01:6379> ttl key5 (integer) 8 redis01:6379> ttl key5 (integer) 6 redis01:6379> persist key5 (integer) 1 redis01:6379> ttl key5 (integer) -1
列表 LPUSH命令可向list的左边(头部)添加一个新元素; RPUSH命令可向list的右边(尾部)添加一个新元素; LRANGE可以从list中取出一定范围的元素。 实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 redis01:6379> rpush list1 A (integer) 1 redis01:6379> rpush list1 B (integer) 2 redis01:6379> lpush list1 top1 (integer) 3 redis01:6379> lrange list1 0 -1 1) "top1" 2) "A" 3) "B" redis01:6379> lrange list1 1 -1 1) "A" 2) "B" redis01:6379> lrange list1 2 -1 1) "B"
rpop从列表中元素左边开始依次删除; lpop从列表中元素右边开始依次删除。 实例:
1 2 3 4 5 6 7 8 9 redis01:6379> rpop list1 "B" redis01:6379> lrange list1 0 -1 1) "top1" 2) "A" redis01:6379> lpop list1 "top1" redis01:6379> lrange list1 0 -1 1) "A"
哈希 Hash看起来就像一个’hash’的样子,由键值对组成 HMSET指令设置hash中的多个域; HGET取回单个域; HMGET取回一系列的值。 实例:
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 redis01:6379> hmset user:1000 username linuxboy age 18 job it OK redis01:6379> hget user:1000 username "linuxboy" redis01:6379> hmget user:1000 username age job 1) "linuxboy" 2) "18" 3) "it" redis01:6379> hgetall user:1000 1) "username" 2) "linuxboy" 3) "age" 4) "18" 5) "job" 6) "it" redis01:6379> hmset user:1000 qq 1767361332 OK redis01:6379> hgetall user:1000 1) "username" 2) "linuxboy" 3) "age" 4) "18" 5) "job" 6) "it" 7) "qq" 8) "1767361332"
集合 集合是字符串的无序排列; SADD指令把新的元素添加到set中。 实例:
1 2 3 4 5 6 redis01:6379> sadd set1 1 2 3 (integer) 3 redis01:6379> smembers set1 1) "1" 2) "2" 3) "3"
和list类型不同,set集合不允许出现重复的元素
1 2 3 4 5 6 7 redis01:6379> sadd set1 1 4 (integer) 1 redis01:6379> smembers set1 1) "1" 2) "2" 3) "3" 4) "4"
Srem用来删除指定的值
1 2 3 4 5 redis01:6379> srem set1 2 4 (integer) 2 redis01:6379> smembers set1 1) "1" 2) "3"
Sdiff计算集合的差异成员
1 2 3 redis01:6379> sinter set1 set2 1) "1" 2) "4"
Sunion计算集合并集
1 2 3 4 5 6 redis01:6379> sunion set1 set2 1) "1" 2) "2" 3) "3" 4) "4" 5) "5"