redis数据库
一. 事务
- 原子性: 一个事务是不可分割的整体,执行操作时就是一起做,或者一起都不做
- 一致性:意思是张三给李四转了100元,李四就必须加100元
- 隔离性 意思是写数据是隔离开
- 持久性 意思是数据库的改变不能返回,改了就改了
二. 安装redis数据库
yum install redis
三 redis相关的命令
redis-server #启动redis数据库服务器
redis-server & #启动redis数据库服务器并且让它在后台运行
redis-cli #进入redis客户端
redis-cli -h 127.18.40.58 -p 6379 -a "123456" 连接到其他redis服务器
四. redis五大数据类型
- 字符串(string)
set key value #设置key的值
get key #获取key的值
mset key1 value1 key2 value2 ... #设置多个key的值
mget key1 key2... #获取多个key的值
getrange key start end #返回key中字符串值的子串(切片)
incr key #将key中的数值加一
decr key #将key中的数值减一
append key value #将指定的值追加到key的字符值的后面
- hash
hset key field value #将哈希表 key 中的字段 field 的值设为 value
hget key field #获取哈希表key中的字段field的值
hgetall key #获取哈希表key的所有字段和值
hkeys key #获取哈希表中所有的key
hvals key # 获取哈希表中所有的filed
hdel key field #删除哈希表key中的field的值
- list(列表)
lpush key value1 value2... #在列表key头部插入数据
rpush key value1 value2... #在列表key末尾插入数据
lrange key start end #获取列表key指定范围的元素
rpop key #删除列表key最后一个元素
llen key #获取列表key的长度
- set(集合)
sadd key member1 member2 member3.... #向集合key添加一个或多个成员
scart key #获取集合key的成员数
spop key #移除并返回集合key中的一个随机数
smembers key #获取列表key的所有的成员
- sorted set(有序集合)
zadd key score1 value1 score2 value2 ... #向有序集合添加一个或多个成员
zadd myzset 1 "one" 2 "two" 3 "three" #例子
zcard key #获取有序集合的成员数
五.redis练习题(redis实现登录)
import sys
import pymysql # 导入mysql接口模块
import redis # 导入redis接口模块
def con_mysql(sql): # 连接mysql数据函数
db = pymysql.Connect(host='localhost',
user='root',
passwd='123456',
db='company',
port=3306,
charset='utf8'
)
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchall()
db.close()
return data
def con_redis(name,passwd): #连接redis数据库函数
r = redis.Redis(host='39.108.188.19',port=6379)
r_name = r.hget('user','name') #获取redis数据库中用户名
r_passwd = r.hget('user','passwd') # 获取redis数据库中的密码
r_name = r_name.decode('utf8') # 转换字符
r_passwd = r_passwd。decode('utf8') # 转换字符
# 判断用户输入的用户名和密码是不是和redis数据库的相等
if name == r_name and passwd == r_passwd:
return Ture,'登陆成功'
else:
return False,'登录失败'
if __name__ = '__main__’:
name = sys.argv[1] #拿到用户输入的用户名
passwd = sys.argv[2] # 拿到用户输入的密码
resoult = con_redis(name,passwd)
if not result[0]:
sql = ''' select * from tb_user where user="%s" and passwd="%s" ''' %(name,passwd)
data = con_mysql(sql)
if data:
r = redis.Redis(host='39.108.188.19',port=6379)
r.hset = ('user','name',name) # 更新redis数据库
r.hset = ('user','passwd',passwd)#更新redis数据库
print('刷新redis.登录成功')
else:
print('用户名或者密码错误')
else:
print('redis中的数据正确',登录成功)
redis的好处
- 速度快,因为数据保存在内存中
- 支持丰富的数据类型,支持string,list,set,sorted set,hash
- 支持事物,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
- 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后自动删除
mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
知识介绍:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
- voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
- allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-enviction(驱逐):禁止驱逐数据
redis最适合的场景
- 会话缓存(Session Cache)
- 全页缓存(FPC)
- 队列
- 排行榜/计数器
- 发布/订阅