redis的学习

java 寻梦 6年前 (2019-04-10) 402次浏览 0个评论 扫描二维码
文章目录[隐藏]

年仅10岁的数据库

关系型数据库(sql)如:MySQL,oracle,sqlserver
特点:数据和数据之间,表和字段之间,表和表之间是存在关系的
优点:①数据之间有关系,进行数据的增删改查时非常方便的
②关系型数据库 有事务操作。 保证数据的完整性
缺点:①因为数据和数据之间有关系的,关系是由底层大量算法保证,大量算法会 拉低系统运行速度大量算法会消耗系统资源
        ②海量数据的增删改查时会显得无能为力。 很可能宕机
  ③海量数据环境下对数据表进行维护/扩展,也会变得无能为力
适合处理一般量级数据,安全

 非关系型数据库(onsql)如:Redis       
为了处理海量数据,需要将关系型数据库的关系 去掉。非关系型数据库设计之初 是为了替代 关系型数据库的
优点:①海量数据的增删改查,非常轻松应对
        ②海量数据的维护非常轻松。
缺点:①数据和数据之间没有关系,所以不能一目了然
           ②非关系型数据库,没有关系,没有强大的事务保证数据的 完整和安全
适合处理海量数据,效率,不一定安全

Redis使用环境
①关系型数据库的缓存

② 可以做任务队列
③ 大量数据运算
④排行榜

ubuntu安装redis
$sudo apt-get update
$sudo apt-get install redis-server
redis后端启动
先进入redis目录,然后执行redis-server ./redis
客户端启动
前端启动就不说了,不支持集群开发。
redis-cli -h ip地址 -p 端口 同一台服务器也可以直接redis-cli
redis关闭
①查询到PID(ps -ef|grep -i redis),kill -9 pid  【断电,非正常关闭,一般不用,否则造成数据丢失】
②正常关闭  【正常关闭,数据保存】redis-cli shutdown(不知道为啥,我执行了这个命令进程仍然还在)(源码安装的redis)

停止/启动/重启redis

/etc/init.d/redis-server stop/etc/init.d/redis-server start/etc/init.d/redis-server restart

相关配置
配置文件位置/etc/redis/redis.conf
添加密码:
#取消注释requirepass
requirepass 123456
redis-cli -a 123456
允许远程连接:
#注释bind
#bind 127.0.0.1

redis数据类型
redis 使用的是键值对 保存数据。(map)
key:全部都是字符串
value:有五种数据类型

redis的String命令
字符串类型是Redis中最为基础、常用的数据存储类型,字符串在Redis中是二进制安全的(二进制安全和数据安全是没有关系的),这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

MySQL-关系型数据库,二进制不安全。【乱码丢失数据】
Redis  二进制数据安全

赋值:set key value
取值:get ke
删除:del key
扩展:getset key value:先获取该key的值,然后在设置该key的值
incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息。相当于 ++i(Incr和decr 只能对字符串是数字的 进行操作)
decr key:将指定的key的value原子性的递减1,相当于 –i。(incrby/decrby key 数值)
append key value:拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value

redis的hash命令

Redis中的Hash类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
Hash  —-à   {username:”张三”,age:”18”,sex:”man”}——javaBean
Hash特点:占用的磁盘空间极少

赋值:hset key field value:为指定的key设定field/value对(键值对)
hmset key field value  [field2 value2 …]:设置key中的多个filed/value
取值:hmget key filed1 filed2 ….:获取key中的多个filed的值
hgetall key:获取key中的所有filed-vaule
删除:hdel key field删除指定key中的field
del key :删除整个hash
扩展:hincrby hash1 age 10 :hsah1中的age字段增加10
hexists key field:判断指定key中的field是否存在(返回0/1)
hlen key:获取key中包含的field数量
keys * :查询所有的key
hkeys key :获得所有的字段
hvals key:获得所有的value

redis的list命令
两端添加lpush key values[value1 value2…]:在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
rpush key values[value1、value2…]:在该list的尾部添加元素
查看:lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个依次类推… 查看所有lrange key 0 -1
删除lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。
rpop key:从尾部弹出元素。
扩展:llen key 获取key链表的元素个数
lrem key count value 删除key链表中count个value元素count为0时删除所有value元素rpoplpush resource destination:将resource链表中的尾部元素弹出并添加到destination链表头部。[循环操作]【重要
linsert list1 before jj ff 在list1链表中jj元素前插入ff元素(效率低,需要进行元素赋值)

redis中的set命令
Redis 的 Set 是 String 类型的无序集合,集合成员是唯一的 [并集,交集,差集运算]
赋值:sadd key values[value1、value2…]:向set中添加数据,如果该key的值已有则不会重复添加
删除:srem key members[member1、member2…]:删除set中指定的成员
取值:smembers key:获取set中所有的成员
sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在(无论集合中有多少元素都可以极速的返回结果)
差集运算:sdiff set1 set2属于set1但不属于set2的元素
交集:sinter set1 set2属于set1又属于set2
并集:sunion set1 set2属于set1或者属于set2的元素(set1,set2的所有元素)
扩展命令:scard key获取set中成员的数量
srandmember key:随机返回set中的一个成员
sunionstore destination set1 set2:将set1、set2返回的并集存储在destination集合中(交集差集类似)

redis中的有序set(排行榜)
赋值:zadd key score member score2 member2 … :将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
查看:zscore key member:返回指定成员的分数
zrange key start end [withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数。(分数由小到大排列)
zrevrange key start end [withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数。(分数由大到小排列)
zrangebyscore set1 0 1000 withscores limit 0 2:查询set1中0到1000分的前两个
删值:zrem key member[member…]:移除集合中指定的成员,可以指定多个成员
zremrangebyrank key start stop:按照排名范围删除元素
zremrangebyscore key min max:按照分数范围删除元素
扩展:zincrby key 20 kk:集合key中指定的kk元素增加20分
zcount key min max:获取分数在[min,max]之间的元素个数
zrank key member:返回元素在集合中的排名,索引(从小到大)
zrevrank key member(从大到小)

通用命令
keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys。
通配符:*表示任意0个或多个任意字符,?表示任意一个字符
keys *:查询所有的key;
keys ???:匹配key长度为3的key;
keys *name*:匹配包含name的key
del key1 key2:删除指定的key
exists key:判断该key是否存在,1代表存在,0代表不存在
type key:获取指定key的值类型。该命令将以字符串的格式返回。   返回的字符串为string、list、set、hash和zset,如果key不存在返回none
rename key newname:为指定key重命名
dbsize:返回当前数据库中key 的数目
info    查看redis数据
设置key有效/过期expire key :设置key的生存时间,单位:秒,如果某个key过期,redis会将其删除
ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1。如果返回-2表示超时不存在
订阅新闻,新闻发布
subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道
psubscribe channel*:批量订阅频道,例:psubscribe s*,订阅以”s”开头的频道
publish channel content:在指定的频道中发布消息,如 publish mychat ‘today is a newday’

redis多数据库-也是有数据库的。 Redis已经提前创建好了。
Redis默认有16个数据库。0,1,2…….15
在redis上所做的所有数据操作,都是默认在0号数据库上操作
数据库和数据库之间,不能共享键值对
切换数据库:select 数据库名
把某个键值对进行数据库移植:move newkey 1:将当前库的key移植到1号库中
慎用:清空当前数据库:flushdb
和redis服务器数据的清空:flushall

事务
MySQL-事务: 目的为了保证数据完整性,安全
Redis-事务:  目的为了进行redis语句的批量化执行
multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行EXEC时,这些命令才会被原子的执行,类似与关系型数据库中的:begin transaction
exec:提交事务,类似与关系型数据库中的:commit        执行批量化
discard:事务回滚,类似与关系型数据库中的:rollback     不执行批量化操作

redis-docker

docker@default ~$ 
docker run --name myredis --restart=always --network dqgs -p 6379:6379 -v /etc/redis/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
docker run --name myredis --restart=always --network dqgs -p 6379:6379 -v  C:\Users\1024\Documents\data\redis\redis.conf:/etc/redis/redis.conf -v  C:\Users\1024\Documents\data\redis\data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456

相关文献
redis官网
http://www.runoob.com/redis/redistutorial.html
https://www.cnblogs.com/zongfa/p/7808807.html
https://blog.csdn.net/m0_37572458/article/details/77675548

喜欢 (0)
[支付宝扫码,感谢支持]
分享 (0)
关于作者:

您必须 登录 才能发表评论!