mysql 和Redis 区别 和mysql 和Redis 事务的区别,Redis介绍及常用命令。

一,Redis

Redis支持五种数据类型: 五大基本数据类型:字符串(String,字符串列表(list,有序字符创集合(sorted set,哈希(hash,字符串集合(set
  key定义的注意点:1,key值不要太长,不要超过1024字节。2,不要太短,可读性太差,3命名规范

常用五大数据类型简介:

    1String(字符串):是redis最基本的类型,一个key对应一个value,字符串value最多512M,是二进制安全,意思是redisString可以包含任何数据类型

    2Hash(哈希):是一个键值对集合:类似Java里面的Map<String,Object>,是一个String类型的fieldvalue的映射表,特别适合用于存储对象

    3List(列表):是简单的字符串列表,按照插入顺序,你可以添加一个元素导列表的头部或尾部,它的底层是个链表

    4Set(集合):是String类型的元素集合。它是通过Hash Table实现的

    5ZSetSorted set):有序集合,所有元素都会关联一个double类型的分数

存储Hash

  String key String Valuemap容器,每个Hash可以存很多键值对。相当于java里面的HashMap.
  赋值:hest myhash username dh,多个赋值,hmset myhash username dh age 21.取值:hget myhash username,一次取多个值hget myhash username age.全部取出来 hgetall myhash.
  删除:单个删除:hdel myhash user age,del myhash是删除整个集合。同一样可以加值操作, hincrby myhash age 5,也有删除操作hdecrby myhash age 5,判断hash中是否存在某个key:hexists myhash username,成功返回1,不成功返回0.判断hash中多少属性key:hlen myhash.获得所有的key:hkeys myhash,获取所有value:hvalue myhash

list

  按照插入顺序的链表。可以从头部和尾部插入,没有key时创建这个key,数据没了删除这个key,链表的操作特征,大家都懂的。

  这些方式来存储数据ArrayList,linklist双向链表
  左边插入数据Ipush mylist a,b,c,建立一个list,并且把数据插进去,就像栈一样,返回值是链表的个数。
  右侧插入rpush mylist a b,c
  查看链表 lrange mylist 0 5,查看链表0-5的元素。0代表第一个元素,-1代表最后一个元素。那么查看索引信息的
  左侧弹出元素 lpop mylist
  右侧弹出元素 rpop mylist
  获取元素个数 llen mylist
  lpushx,rpushx这个和lpush差不多一样,但是没有这个key的时候是不会创建这个链表的。
  lrem mylist count 1,cout>0,那么从头开始删除数目为count1,当count<0,从尾部开始删除绝对值为count1,如果count=0,那么删除所有的1,。
  lset mylist 3 mmm,效果是吧第四个元素替换为mmm,
  linsert mylist before b 11,在这个mylist的这个list里面的这个b元素前边插入11
  linsert mylist after b 11,在这个mylist的这个list里面的这个b元素后边插入11
   rpoplpush mylist mylist1 list1结尾的元素放到list2首部,这个主要用于消息队列

存储set

  javaset集合类似。也类似于集合。
  sadd myset a b c,添加元素
  srem myset a删除元素
  smembers myset 返回集合的所有元素。
  sismember myset a,判断集合是否存在a,返回值为1表示存在,返回值为0表示不存在。
  sdiff myset myset1,返回myset1中没有,但是myset有的值。
  sinter myset myset1 返回这2个都有的值,也就是交集。
  sunion myset myset1 ,这个就是求着2个集合的并集。
  scard myset 返回集合的数目
  srandmember myset 返回随机一个集合的元素
  sdiffstore my1 myset myset1,就是将mysetmyset1按这个顺序做一个差集,再把这个差集添加到my1这个集合里面去。
  sinterstore my1 myset myset1,就是将mysetmyset1做一个交集,再把这个交集添加到my1这个集合里面去。
  sunionstore my1 myset myset1,就是将mysetmyset1做一个并集,再把这个并集添加到my1这个集合里面去。
  

Sorted-set

  Set差不多属性,就是多了个排序的能力。
  zadd mysort 70 cs 80 ls 90 ss,增加3个元素,前面的是分数,代表其在sorted-set中的顺序,如果在添加zadd mysort 100 cs,这个value已经有了,那么就会用新的分数代替旧的分数。
  zscore mysort cs 获取cs这个value对应的分数。
  zcard mysort 返回这个sorted-set里面多少元素。
  zrem mysort tom ww,删除tom,ww这个2个值。
  zrange mysort 0 -1,list的操作一样。这个只是返回值。
  zrange mysqrt 0 -1 withscores,多返回了分数,从小到大的顺序出来。
  zrevrange mysort 0 -1 withscores 从大到小排序。
  zremrangebyrank mysort 0 4,范围删除。
  zremrangebyscore mysort 80 100,按照分数范围删除。
  zrangebyscore mysort 0 100,分数从0100value
  zrangebyscore mysort 0 100 withscores 和上面一样就是多了分数。
  zrangebyscore mysort 0 100 withscores limit 0 2,选取前面2个数据
  zincrby mysort 3 ls,给ls这个元素的分数加3.
  zcount mysort 80 90,分数8090的个数。

keys操作

   keys * 查看所有的keys
  keys my? my开头的keys.
  del my1,my2,删除这些keys.
  exists mykeys判断这个key是否存在。
  rename company newname,给这个key重命名
  expire newname 1000.1000秒就过期。ke
  ttl newname 所剩超时时间
  type newname返回类型

 

二,Redis常用命令:

#开启Redis服务

redis-server

#连接本地Redis数据库

redis-cli

#连接远程Redis数据库

redis-cli -h host -p port -a password

#测试命令结果返回PONG表示正常

ping

#选择数据库,默认有16个数据库编号0-15

select 0

 

#数据操作

#删除全部数据

flushall

 

#String字符串操作

#添加/修改键值对

set name zs

set age 19

#添加多个键值对

mset name zs age 10

#根据key获取value

get name

#获取多个value

mget name age

#设置键值对有效期10s

setex name 10 zs

#value后追加内容

append name ls

 

#键命令

#查看键对应的value的类型

type name

#查看所有键(支持正则表达式)

keys *

#删除键值对

del name

#设置键值对过期时间

expire name 10

#查看键值对过期时间(负数表示已过期)

ttl name

#查看键是否存在

exists name

#hash哈希操作

#设置单个属性

hset person name zs

#设置多个属性

hmset person name zs age 22

#获取单个属性

hget person name

#获取多个属性

hmget person name age

#获取所有属性的值

hvals person

#删除单个属性

del person name

#删除多个属性

hdel person name age

#删除整个hset

del person

 

#list列表操作

#在左侧插入数据

lpush list 1 2 3 4 5

#在右侧插入数据

rpush lsit 5 4 3

#查看指定索引范围0-末尾的数据

lrange list 0 -1

#删除指定位置的数据(从左边开始删除一个3

lrem list 3 1

 

#set集合操作

#添加多个数据

sadd st1 1 2 3 4

#获取所有成员数据

smember set1

#删除指定成员

srem set1 1 2

 

#zset有序集合

#添加指定权重的数据

zset zset1 10 zs 20 ls 30 ww

#查询指定索引范围的数据

zrange zset 0 -1

#查询指定权重范围的数据

zrangebyscore zset1 10 20

#查询指定数据的权重

zscore zset1 zs

#删除指定数据

zrem zset1 zs

#删除指定权重范围的数据

zremrangebyscore zset1 10 20

三,事务

事务的基本特征:

原子性:一个事务中的所有语句,应该做到:要么全做,要么一个都不做;
一致性:让数据保持逻辑上的“合理性”并得到实施,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1;
隔离性:如果多个事务同时并发执行,但每个事务就像各自独立执行一样。
持久性:一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。

 

mysql 事务和Redis 事务的区别:

mysql

  • Begin:显式的开启一个事务
  • Commit:提交事务,将对数据库进行的所有的修改变成永久性的
  • Rollback:结束用户的事务,并撤销现在正在进行的未提交的修改

大致如下: 
1, 开启一个事务: 
start transaction; 
也可以使用“begin; ” 
2,执行业务中需要保持逻辑一致性的多条语句; 
insert .....; 
delete ......; 
update ......; 
事务中,其实只是对增删改进行控制,而查询语句,无所谓——因为查询不改变数据; 
3,判断是否出错并采取相应措施: 
if (出错){ 
rollback;//就是通常所说的“回滚”——就是啥也不做了,就是全部撤销; 

else{ 
commit;//就是通常所说的“提交”——就是全都生效; 
}

Redis

  • Multi:标记事务的开始
  • Exec:执行事务的commands队列
  • Discard:结束事务,并清除commands队列
  1. Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证

 

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

2.一个事务从开始到执行会经历以下三个阶段先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:):

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

 

默认状态:

mysql

mysql会默认开启一个事务,且缺省设置是自动提交,即每成功执行一次sql,一个事务就会马上commit,所以不能rollback

redis

redis默认不会开启事务,即command会立即执行,而不会排队,并不支持rollback

使用方式:

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

redis

multiexecdiscard,显式开启并控制一个Transaction。(注意:这里没有强调 “新的” ,因为默认是不会开启事务的)。

实现原理:

Mysql

1.mysql实现事务,是基于undo/redo日志

2.undo记录修改前状态,rollback基于undo日志实现

3.redo记录修改后的状态,commit基于redo日志实现

4.mysql中无论是否开启事务,sql都会被立即执行并返回执行结果,只是事务开启后执行后的状态只是记录在redo日志,执行commit之后,数据才会被写入磁盘

redis:

1.redis实现事务,是基于commands队列

2.如果没有开启事务,command将会被立即执行并返回执行结果,并且直接写入磁盘

3.如果事务开启,command不会被立即执行,而是排入队列,并返回排队状态(具体依赖于客户端(例如:spring-data-redis)自身实现)。调用exec才会执行commands队列

三,mysqlredis的区别

首先,我们知道,mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在用的最多的 memcached(简称mc)。首先,用户访问mc,如果未命中,就去访问mysql,之后像内存和硬盘一样,把数据复制到mc一部分。

redismc都是缓存,并且都是驻留在内存中运行的,这大大提升了高数据量web访问的访问速度。然而mc只是提供了简单的数据结构,比如 string存储;redis却提供了大量的数据结构,比如stringlistsethashsetsorted set这些

内存和硬盘的关系,硬盘放置主体数据用于持久化存储,而内存则是当前运行的那部分数据,CPU访问内存而不是磁盘,这大大提升了运行的速度,当然这是基于程序的局部化访问原理。

  推理到redis+mysql,它是内存+磁盘关系的一个映射,mysql放在磁盘,redis放在内存,这样的话,web应用每次只访问redis,如果没有找到的数据,才去访问Mysql

 

1.mysqlredis的数据库类型

mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

redisNOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限

2.mysql的运行机制

mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库。第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。

3.缓存

缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。

缓存的好处就是读取速度快

4.redis数据库

redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。

5.redismysql的区别总结

1)类型上

从类型上来说,mysql是关系型数据库,redis是缓存数据库

2)作用上

mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢

redis用于存储使用较为频繁的数据到缓存中,读取速度快

3)需求上

mysqlredis因为需求的不同,一般都是配合使用。

最近接触 redis,发现其读取速度快,突然想到,redis 怎么和数据库同步呢,怎么能把数据库的所有数据存到redis里面,能使用户更快速的查找。

方法1mysql 同步到redis:解析mysqlbinlog,然后做同步处理,可以使用的库有:open-replicatorhttps://github.com/whitesock/open-replicator

方法2:同步redis数据到mysql:(https://github.com/leonchen83/redis-replicator

后来发现,redis读取速度快,也没有必要把所有的数据都放到redis里面,redis里面只放使用频繁,用户操作量较大的数据,或者用户近期使用的数据。解决办法: 
1
:读取数据的时候先从redis里面查,若没有,再去数据库查,同时写到redis里面,并且要设置失效时间。 
2
:存数据的时候要具体情况具体分析,可以选择同时插到数据库和redis(要是存放到redis中,最好设置失效时间),也可以选择直接插到数据库里面,少考虑一些问题。

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值