首页 > 数据库 >redis

redis

时间:2022-11-03 19:37:11浏览次数:43  
标签:hash name redis Redis value key

一、简介

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

二、数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

string(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

list(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

Set(集合)

Redis 的 Set 是 string 类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

三、事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

四、持久化

Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而整个过程就叫做 Redis 持久化。

 

1、Redis 持久化方式:

 

快照方式(RDB, Redis DataBase)将某一个时刻的内存数据,以二进制的方式写入磁盘;

 

文件追加方式(AOF, Append Only File),记录所有的操作命令,并以文本的形式追加到文件中;

 

混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。

 

2、rdb触发方式

手动

2.1、save 命令 在客户端中执行 save 命令,就会触发 Redis 的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以在生产环境一定要慎用。

2.2、bgsave 命令 bgsave(background save)既后台保存的意思, 它和 save 命令最大的区别就是 bgsave 会 fork() 一个子进程来执行持久化,整个过程中只有在 fork() 子进程时有短暂的阻塞,当子进程被创建之后,Redis 的主进程就可以响应其他客户端的请求了,相对于整个流程都阻塞的 save 命令来说,显然 bgsave 命令更适合我们使用。

2.3、save m n save m n 是指在 m 秒内,如果有 n 个键发生改变,则自动触发持久化。 参数 m 和 n 可以在 Redis 的配置文件中找到,例如,save 60 1 则表明在 60 秒内,至少有一个键发生改变,就会触发 RDB 持久化。 自动触发持久化,本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave 命令。 注意:当设置多个 save m n 命令时,满足任意一个条件都会触发持久化。

2.4、flushall flushall 命令用于清空 Redis 数据库,在生产环境下一定慎用,当 Redis 执行了 flushall 命令之后,则会触发自动持久化,把 RDB 文件清空。

 

 

 

五、redis常用命令及基本用法

1、redis连接

import redis

r =redis.Redis(host='127.0.0.1',port=6379)

2、也可以使用连接池连接

import redis

p = redis.ConnectionPool(host='127.0.0.1', port=6379)

3、基本命令string

import redis

r =redis.Redis(host='127.0.0.1',port=6379)

#1、存储数据set(name, value, ex=None, px=None, nx=False, xx=False)
#ex,过期时间(秒)
#px,过期时间(毫秒)
#nx,如果设置为True,则只有name不存在时,当前set操作才执行
#xx,如果设置为True,则只有name存在时,当前set操作才执行
r.set('name','pt')


#2、批量设置值mset(*args, **kwargs)
r.mset(k1='v1', k2='v2')

#3.批量获取mget(keys, *args)
r.mget("k1","k2")

#4.修改值getset(name, value),将k1的值换成v2
r.getset("k1","v2"))

4、基本命令hash

import redis

r =redis.Redis(host='127.0.0.1',port=6379)

#1、单个增加--修改(单个取出)--没有就新增,有的话就修改
#hset(name, key, value)
#name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
#参数:
#name,redis的name
#key,name对应的hash中的key
#value,name对应的hash中的value
r.hset("name_hash","k1","v1")

#2、hsetnx(name, key, value)只能新建
r.hsetnx("name_hash","k1","v1")

#3、批量增加(取出)
#hmset(name, mapping)
#在name对应的hash中批量设置键值对
#参数:
#name,redis的name
#mapping,字典,如:{'k1':'v1', 'k2': 'v2'}
r.hmset('xx', {'k1':'v1', 'k2': 'v2'})

#4、取出单个
#hget(name,key)
#在name对应的hash中获取根据key获取value
r.hget("name_hash","k2")

#5、批量取出
#hmget(name, keys, *args)
#在name对应的hash中获取多个key的值
#参数:
#name,reids对应的name
#keys,要获取key集合,如:['k1', 'k2', 'k3']
#*args,要获取的key,如:k1,k2,k3
r.hmget('xx', 'k1', 'k2')

#6、取出所有的键值对
#hgetall(name)
#获取name对应hash的所有键值
r.hgetall("name_hash")

#7、删除键值对
#hdel(name,*keys)
#将name对应的hash中指定key的键值对删除
r.hdel("name_hash","k1") 删除一个键值对

5、基本命令list

import redis

r =redis.Redis(host='127.0.0.1',port=6379)

#1、增加(类似于list的append,只是这里是从左边新增加)--没有就新建
#lpush(name,values)
#在name对应的list中添加元素,每个新的元素都添加到列表的最左边
r.lpush('oo', 11,22,33)

#2、增加(从右边增加)--没有就新建
r.lpush('oo', 11,22,33)

#3、新增(固定索引号位置插入元素)
linsert(name, where, refvalue, value))
#在name对应的列表的某一个值前或后插入一个新值
#参数:
#name,redis的name
#where,BEFORE或AFTER
#refvalue,标杆值,即:在它前后插入数据
#value,要插入的数据
r.linsert("foo_list1","before","22","33")

#4、修改
#lset(name, index, value)
#对name对应的list中的某一个索引位置重新赋值
#参数:
#name,redis的name
#index,list的索引位置
#value,要设置的值
r.lset("name_list",4,20)

#5、删除
#lrem(name, value, num)
#在name对应的list中删除指定的值
#参数:
#name,redis的name
#value,要删除的值
#num, num=0,删除列表中所有的指定值;
#num=2,从前到后,删除2个; num=1,从前到后,删除左边第1个
#num=-2,从后向前,删除2个
r.lrem("foo_list1","2",1)

#6、取值(根据索引号取值)
lindex(name, index)
在name对应的列表中根据索引获取列表元素
r.lindex("name_list",0)

6、基本命令set

import redis

r =redis.Redis(host='127.0.0.1',port=6379)

#1、新增
#sadd(name,values)
#name对应的集合中添加元素
r.sadd("set1",33,44,55,66)

#2、 获取元素个数 类似于len
scard(name)
#获取name对应的集合中元素个数
r.scard("set1")

#3、 获取集合中所有的成员
smembers(name)
#获取name对应的集合的所有成员
r.smembers("set1")

#4、删除,随机删除,返回被删除值
#spop(name)
r.spop("set1")

#5、指定删除
#srem(name, values)
r.srem("set1",66)

7、基本命令有序集合

import redis

r =redis.Redis(host='127.0.0.1',port=6379)

#1、新增
#zadd(name, *args, **kwargs)
#在name对应的有序集合中添加元素
r.zadd('zz', 'n1', 1, 'n2', 2)

#2、获取有序集合元素个数 类似于len
#zcard(name)
#获取name对应的有序集合元素的数量
r.zcard('zz')

#3、获取name对应的有序集合中分数 在 [min,max] 之间的个数
#zcount(name, min, max)
r.zcount("zz",11,22)

#4、删除--指定值删除
#zrem(name, values)
r.zrem('zz', ['s1', 's2'])

8、其他常规操作

#1 删除
delete(*names)
#根据删除redis中的任意数据类型(string、hash、list、set、有序set)

#2、检查名字是否存在
#exists(name)
#检测redis的name是否存在
r.exists("ste1") True 存在就是True, False 不存在就是False

#3、模糊匹配
#keys(pattern='*')
#根据模型获取redis的name
r.keys(pattern='ss')

#4、设置超时时间
#expire(name ,time)
#为某个redis的某个name设置超时时间
r.expire(name ,5)

#5、 重命名
#rename(src, dst)
#对redis的name重命名为
r.rename("name2","name1")

#6、获取类型
#type(name)
#获取name对应值的类型
r.type("set1")

#7、查看所有元素
#scan(cursor=0, match=None, count=None)

 

 

 

 

标签:hash,name,redis,Redis,value,key
From: https://www.cnblogs.com/songyunjie/p/16855566.html

相关文章

  • Redis Desktop Manager(Redis可视化工具)安装及使用教程
    1、https://blog.csdn.net/m0_55070913/article/details/123677891RedisDesktopManager(Redis可视化工具)安装及使用教程2、一、工具/材料官网下载:https://redisdesk......
  • Redis系列9:Geo 类型赋能亿级地图位置计算
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集......
  • Redisson 分布式锁实现之前置篇 → Redis 的发布/订阅 与 Lua
    开心一刻我找了个女朋友,挺丑的那一种,她也知道自己丑,平常都不好意思和我一块出门昨晚,我带她逛超市,听到有两个人在我们背后小声嘀咕:“看咱前面,想不到这么丑都有人要。......
  • [springboot, lettuce] io.lettuce.core.RedisCommandTimeoutException: Command time
    https://blog.csdn.net/zzhongcy/article/details/118935350?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFr......
  • Windows系统Redis集群搭建
    一、参考网址https://mp.weixin.qq.com/s/ImdEJTdAmCFJsT55rici0Q二、Redis版本注意:搭建windows版的redis集群,redis的版本需要5.0及以上5.0版本redis下载地址:githhb下......
  • RedisTemplate自适应Redis配置模式config
    RedisTemplate配置Java源码:importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom.fasterx......
  • Ubuntu上配置redis哨兵模式
    在Ubuntu上我使用的是APT命令安装Redis:sudoaptinstallredis,安装完成之后redis.conf的默认路径是:/etc/redis,redis-server的默认路径是:/usr/bin/redis-server假设我们有......
  • redis实现主从复制
     前面说到了redis在单机的模式下是可以数据持久化的,但是不可以解决单点失败的问题,当单台redis服务器出现问题时,就可能会造成数据的丢失;想要解决这个问题的话我们可以使用R......
  • 玩转Redis集群
    玩转Ridis集群Reids集群模式主从模式哨兵模式(Sentinel)Cluster模式一、主从模式ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅠ、直接配置运行Redis1.1master(主库)#......
  • 一线互联网大厂都是怎么面试Redis 审核中
    Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库。随着Redis的热度越来越高......