-
redis 是什么
-
安装redis
-
redis 数据类型
-
redis应用有哪些
-
python操作redis
redis 是什么
NoSQL 非关系型数据库 数据保存在内存中 速度超快
速度比mysql快
只有key value
八种数据类型 常用的有五种数据类型
key最大支持 512M
0-15 16个库
默认端口号 6379
-
缓存 因为多个请求要访问mysql 这个时候 mysql 可以将结果存储在 redis中
-
新浪微博
-
你关注了谁 谁关注了你 你们的共同好友
-
你关注的人 关注了谁 系统会给你推荐这些人
-
时间线
-
安装redis
www.redis.cn 下载
linux 版:
wget -c http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxvf redis-5.0.5.tar.gz
sudo mv redis-5.0.5 /usr/local/redis
cd /usr/local/redis
make install
windows 版:
拷贝 ..../redis
edis-windows-mastersrcmsopentech 下面的目录到 c盘指定的目录
windows+r cmd
切换到redis-server.exe所在的目录
编辑 redis.windows.conf
修改 maxmemory 将其改为201915200 (单位是字节)保存
启动:redis-server.exe redis.windows.conf #窗口一直开着 ctrl+c 停止
默认端口号 6379
可视化工具连接 即可
后台启动
将redis-server.exe --service-install redis.windows.conf #将其安装到windows系统服务中
#在命令行中搜索 service 即可打开服务 能看到redis
/usr/local/redis/src
aof rdb 定期从内存中 同步到磁盘中 实现数据的持久化
文件名 | 说明 |
---|---|
redis-server | redis服务器启动脚本 |
redis-cli | redis客户端脚本 |
redis-sentinel | 哨兵服务器 redis2.0之后才有的 |
redis-check-aof | aof修复工具 |
redis-check-rdb | rdb修复工具 |
redis-benchmark | redis性能测试工具 |
/usr/local/redis/src/redis-server #不能关闭窗口
#后台启动步骤
cd /usr/local/redis
sudo vim redis.conf
daemonize yes #将no改为 yes 保存
/usr/local/redis/src/redis-server redis.conf
# redis-cli 不需要切换目录 直接写就可以
mxl@mxl-virtual-machine:~$ redis-cli -h ip地址 -p 端口号
127.0.0.1:6379> ping
PONG #出现PONG 说明成功
127.0.0.1:6379>
#设置密码
127.0.0.1:6379> config set requirepass '123456'
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
设置密码 还可以 sudo vim /usr/local/redis/redis.conf
第507行
requirepass 你的密码
Redis数据类型
不止五种 常用的 有五种数据类型
-
string 最基本的类型
-
hash 缓存常用
-
list 列表
-
set 无序集合
-
zset 有序集合
string
key value 最基本的数据类型 键值对
set key value值
127.0.0.1:6379> set name kangbazi
OK
get key #根据key 获取指定的value值
del key #删除指定的key value值也会被删除
type key #查看key的类型
---------------------------------------------------------------------------
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set name kangbazi
OK
127.0.0.1:6379> get name
"kangbazi"
127.0.0.1:6379> type name
string
---------------------------------------------------------------------------
mset key1 value1 keyn valuen #支持同时设置多个键值对
mget key1 keyn #支持同时取出来
---------------------------------------------------------------------------
127.0.0.1:6379> mset name kangbazi name1 kangbazi1 name2 kangbazi2 name3 kangbazi3
OK
127.0.0.1:6379> mget name name1 name2 name3
1) "kangbazi"
2) "kangbazi1"
3) "kangbazi2"
4) "kangbazi3"
---------------------------------------------------------------------------
incr key #key对应的value 累加1
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> incrby num 100 #指定key的value 增加指定的值
(integer) 102
127.0.0.1:6379> get num
"102"
127.0.0.1:6379> incrbyfloat num 12.34 #指定key的value 增加指定的float类型的值
"64.34"
127.0.0.1:6379> get num
"64.34"
127.0.0.1:6379> setex name 10 kangbazi #往redis存的过程中直接设置过期时间
OK
decr key #key对应的value 累减1
127.0.0.1:6379> decr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> decrby num 50 # 指定key的value 递减指定的值
(integer) 52
127.0.0.1:6379> get num
"52"
strlen key # 查看制定key对应的value值得长度
127.0.0.1:6379> set name kangbazi
OK
127.0.0.1:6379> strlen name
(integer) 8
127.0.0.1:6379> APPEND name boy #往指定key对应的value值后面增加字符串 返回的是增加后字符串的长度
(integer) 11
ttl key #查看 key 在内存中剩余的时间 -1表示永不过期
127.0.0.1:6379> expire key 秒数 #指定指定key 在内存中的过期时间 秒为单位
(integer) 1
127.0.0.1:6379> ttl name
(integer) 5
基础操作
redis有16个库 0-15号
select 1 #切换到1号库 默认0号库
keys * #列出当前库中所有的key
keys n* #查看以n字母开头的key
127.0.0.1:6379> dbsize #查看库的大小
(integer) 4 #里边有4个key
flushdb #清空当前库中所有的key
flushall #清空所有库中的key
hash 就是键值对的集合 特别适合存放对象
每个hash 能够存放2的32次方-1个键值对
id name age height
1 dada 18 181cm
开发过程中 给mysql缓存常用的类型就是hash 一张数据表 就是一个hash
127.0.0.1:6379> hset user name shuliu age 18 height 181cm
(integer) 3
127.0.0.1:6379> hset user1 name yinli age 19 height 185cm
(integer) 3
127.0.0.1:6379> hget user name
"shuliu"
127.0.0.1:6379> hget user age
"18"
127.0.0.1:6379> hget user height
"181cm"
hget user name age height #不能实现 可以通过 hmget hmget 必须是 hmset设置进去的
127.0.0.1:6379> hvals user1 #取出指定key 对应的 属性的值
1) "yinli"
2) "19"
3) "185cm"
127.0.0.1:6379> hkeys user1 ##取出指定key 对应的 属性名称
1) "name"
2) "age"
3) "height"
127.0.0.1:6379> hgetall user1 #取出指定key对应的属性的名称及属性的值
1) "name"
2) "yinli"
3) "age"
4) "19"
5) "height"
6) "185cm"
127.0.0.1:6379> hmset language python num1 java num2 c num3 #同hset 批量设置多个键值
OK
127.0.0.1:6379> hmget language python java c #hget 不能实现多个获取
1) "num1"
2) "num2"
3) "num3"
127.0.0.1:6379> hlen language #查看制定的key 里边有多少个键值对
(integer) 3
127.0.0.1:6379> hexists language javascript #查看指定的key中是否存在指定的属性 存在返回1 不存在返回0
(integer) 0
127.0.0.1:6379> hexists language java #存在 返回1
(integer) 1
127.0.0.1:6379> hexists language python
(integer) 1
127.0.0.1:6379> hdel language java #删除指定key中指定的属性
(integer) 1
127.0.0.1:6379> hexists language java #被删除了 返回0
(integer) 0
127.0.0.1:6379> hmset username name kangbazi666 #查看指定key中属性 对应的value值得长度
OK
127.0.0.1:6379> hstrlen username name
(integer) 11
list 列表
按照顺序从开头或者结尾插入
l left lpush 从左侧也就是开头插入元素 js中的队列方法 unshift shift 先进先出
r right rpush 从右侧 也就是结尾插入元素 js中的栈方法 push pop 先进后出
127.0.0.1:6379> lpush sql mysql
(integer) 1
127.0.0.1:6379> lpush sql redis
(integer) 2
127.0.0.1:6379> lpush sql mongodb
(integer) 3
127.0.0.1:6379> rpush sql sqlserver
(integer) 4
127.0.0.1:6379> rpush sql oracle
(integer) 5
127.0.0.1:6379> rpush sql rabbitmq
(integer) 6
127.0.0.1:6379> lrange sql 0 6 #开始的位置 结束的位置
1) "mongodb"
2) "redis"
3) "mysql"
4) "sqlserver"
5) "oracle"
6) "rabbitmq"
127.0.0.1:6379> lpop sql #移除左侧第一个元素
"mongodb"
127.0.0.1:6379> lrange sql 0 6 #开始的位置 结束位置 下标 redis下标从0开始
1) "redis"
2) "mysql"
3) "sqlserver"
4) "oracle"
5) "rabbitmq"
127.0.0.1:6379> rpop sql #移除右侧第一个元素
"rabbitmq"
127.0.0.1:6379> lrange sql 0 6
1) "redis"
2) "mysql"
3) "sqlserver"
4) "oracle"
127.0.0.1:6379> lindex sql 0 #根据索引查看制定key的元素
"redis"
127.0.0.1:6379> lindex sql 1
"mysql"
127.0.0.1:6379> lindex sql 1
"mysql"
127.0.0.1:6379> lindex sql 2
"sqlserver"
127.0.0.1:6379> lindex sql 3
"oracle"
127.0.0.1:6379> llen sql #查看制定key的列表有多少个元素
(integer) 4
lset key 索引值 元素
127.0.0.1:6379> lset sql 3 mysql
OK
#原来 索引为3的元素 就被mysql覆盖了 原来的mysql还在
set 无序集合
元素唯一性
127.0.0.1:6379> sadd redis one two three
(integer) 3 #表名三个都已经存进去了
127.0.0.1:6379> SMEMBERS redis #取出所有的元素
1) "three"
2) "one"
3) "two"
127.0.0.1:6379> sadd redis one two three #因为已经存在 所以返回0
(integer) 0
127.0.0.1:6379> sadd mysql one two three four five
(integer) 5
127.0.0.1:6379> SDIFF redis mysql #求差集
#谁在前面结果不一样 我有的你有那么返回空 我有的你没有 返回我有的
(empty list or set)
127.0.0.1:6379> SDIFF mysql redis
1) "five"
2) "four"
127.0.0.1:6379> SINTER redis mysql #求交集 顺序无所谓
1) "three"
2) "one"
3) "two"
127.0.0.1:6379> sunion mysql redis #合集
1) "one"
2) "five"
3) "four"
4) "three"
5) "two"
127.0.0.1:6379> sismember mysql four #4是否是mysql中的元素 是返回1 否返回0
(integer) 1
127.0.0.1:6379> sismember mysql six
(integer) 0
zset 有序集合
元素唯一性
分数值可以重复
秒杀
zadd key score member
127.0.0.1:6379> zadd z1 0 zero
(integer) 1
127.0.0.1:6379> zadd z1 1 one
(integer) 1
127.0.0.1:6379> zadd z1 2 two
(integer) 1
127.0.0.1:6379> zrange z1 0 2 #类似于list 中的 lrange
1) "zero"
2) "one"
3) "two"
127.0.0.1:6379> ZRANGEBYSCORE z1 0 1
1) "zero"
2) "one"
127.0.0.1:6379> zadd z1 1 mysql #分数值可以重复
(integer) 1
127.0.0.1:6379> zadd z1 1 redis
(integer) 1
127.0.0.1:6379> zadd z1 1 kangbazi
(integer) 1
127.0.0.1:6379> zadd z1 1 redis #元素不能重复 重复则返回0
(integer) 0
127.0.0.1:6379> zcount z1 1 1 #最小分数值 最大分数值 分数值区间对应的元素数量
(integer) 4 #分数为1 的元素有4个
127.0.0.1:6379> zscore z1 mysql #查看 指定key z1 对应的权重
"1"
127.0.0.1:6379> zcard z1 #指定key下面有多少个元素
(integer) 6
redis 事务
事务就是一个操作
-
原子性 要么全部执行 要么全部不执行
-
隔离性 一个操作进行中 不能被其它操作打扰 按顺序进行
#开启事务 127.0.0.1:6379> multi #开启事务 127.0.0.1:6379> set name kangbazi QUEUED 127.0.0.1:6379> set test test QUEUED 127.0.0.1:6379> set qfedu qdedu QUEUED 127.0.0.1:6379> exec #执行事务 里边的命令顺序执行 1) OK 2) OK 3) OK 127.0.0.1:6379> discard #取消事务 127.0.0.1:6379> watch mxl #监视指定的key 如果执行事务之前 key被修改 那么事务会被中断 unwatch 取消监控
发布和订阅
a窗口: 订阅 redis-cli -h 127.0.0.1 -p 6379 subscribe 频道名称 这里就可以看到 b窗口发不来的消息 b窗口 发布 redis-cli -h 127.0.0.1 -p 6379 publish 频道名称 信息
Python操作redis
git clone https://github.com/andymccurdy/redis-py.git cd redis-py/ python setup.py install
import redis r = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456') #如果打印出来的结果是 b'内容' 说明是bytes类型 如果想转化成 str #需要加参数 decode_responses=True r.set('name','kangbazi') print(r.get('name'))
设置过期时间
import redis res = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456') res.set('username','kangbazi666',ex=30) print(res.get('username'))
操作redis list类型
import redis relist = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456') relist.lpush('language','python') relist.lpush('language','linux') relist.rpush('language','javascript') print(relist.lrange('language',0,-1))
操作redis hash类型
import redis rehashs = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456') rehashs.hset('website','qfedu','qfedu.com') rehashs.hset('website','91','91.com') rehashs.hmset('users',{'username':'kangbazi','password':'66666'}) print(rehashs.hgetall('website')) #属性和值 print(rehashs.hkeys('website')) #只取属性 print(rehashs.hvals('website'))#只取值
事务的操作
import redis reshiwu = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456') pip = reshiwu.pipeline() reshiwu.set('num1','1') reshiwu.set('num2','2') pip.incr('num1') print(reshiwu.get('num1')) pip.decr('num2') print(reshiwu.get('num2')) pip.execute()