美文网首页JAVA集中营程序员
Redis学习笔记(一)

Redis学习笔记(一)

作者: 温柔的石头闯天涯 | 来源:发表于2018-09-28 17:21 被阅读9次

最近在工作中使用到了redis的相关缓存的知识,之前对redis的理解仅仅局限于“缓存数据”、“redis分布式锁”的简单使用,了解的知识面很窄。在结合了多方资料和虚机、java代码进行实操后,加深了对redis的使用和理解。趁热打铁,对学习到的知识做一下总结。


Redis 蛋糕

本次学习笔记 将从以下几个方面进行学习总结:

  • NoSql 简单介绍
  • Redis的基本数据类型

一、NoSql 简单介绍

1、NoSql是什么?

NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。

2、能解决什么?

为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。

3、该怎么用?
NoSql数据库的4大分类 :

  • KV键值,存储数据库(memcache、Redis的存储类型)--本次学习redis存储数据库
  • 文档型数据库(MongoDB)--之后学习
  • 列存储数据库(HBase)--之后学习
  • 图形数据库(Neo4J)--之后学习
    4、分布式数据中需要遵循的CAP原理
  • C:Consistency(强一致性)
  • A:Availability(可用性)
  • P:Partition tolerance(分区容错性)

没有NosQL数据库能同时满足这三点

这句话我个人的理解就是,在对于数据的强一直性和数据的分区容错性之间,系统更加倾向于接受“分区容错性”。在分布式数据库中有个3进2的原则,就是一个分布式系统中,最多只能同时满足CACPAP相互使用。

二、Redis的基本数据类型

String:
在项目中最常见的一个使用方式就是,用来缓存用户的信息, 将用户信息的结构体使用JSON序列化成字符串,然后将序列化后的字符串放入reids的缓存中进行存储。从缓存中取用户信息会经过一次反序列化的过程。

当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。
参考资料 操作实例

单个键值的存取

> set k1 v1  
  OK
> get k1
  "v1"
> del k1
(integer) 1
> get k1
 (nil)

多个键值的存取

> set k2 v2
OK
> mget k1 k2  k3# 返回一个列表
1) "v1"
2) "v2"
3) (nil)
> mset k1 1 k2 2 k3 v3
> mget k1 k2 k3
1) "1"
2) "2"
3) "v3"

key 值的过期策略

> set k4 v4
> get k4
"v4"
> expire k4 5  # 5s 后过期
...  # wait for 5s
> get k4
(nil)

List(链表):
redis的列表类似java的LinkedList,是链表而不是数据,插入和删除速度很快,O(1),索引定位很慢 O(n)。

Redis的列表结构常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进redis的列表,另一个线程从这个列表中轮询数据进行处理。

当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
参考资料 操作实例
右进左出(队列)

> rpush nums 1 2 3
(integer) 3
> llen nums
(integer) 3
> lpop nums
"1"
> lpop nums
"2"
> lpop nums
"3"
> lpop nums
(nil)

右进右出(栈)

> rpush nums 4 5 6
(integer) 3
> rpop nums 
"6"
> rpop nums 
"5"
> rpop nums 
"4"
> rpop nums 
(nil)

Hash:
相当于hashmap,hash结构也可以存储用户的信息,可以对用户结构中的每个字段单独存储, 这样当我们需要获取用户信息时可以进行部分获取。
参考资料 操作实例

> hset books java "think in java"  # 命令行的字符串如果包含空格,要用引号括起来
(integer) 1
> hset books golang "concurrency in go"
(integer) 1
> hset books python "python cookbook"
(integer) 1
> hgetall books  # entries(),key 和 value 间隔出现
1) "java"
2) "think in java"
3) "golang"
4) "concurrency in go"
5) "python"
6) "python cookbook"
> hlen books
(integer) 3
> hget books java
"think in java"
> hset books golang "learning go programming"  # 因为是更新操作,所以返回 0
(integer) 0
> hget books golang
"learning go programming"
> hmset books java "effective java" python "learning python" golang "modern golang programming"  # 批量 set
OK

Set:
相当于Hashset,内部的键值对是无序的惟一的,set结构可以存储活动中中奖的用户ID,因为有去重的功能,可以保证同一个用户不会中奖两次。
参考资料 操作实例

> sadd books python
(integer) 1
> sadd books python  #  重复
(integer) 0
> sadd books java golang
(integer) 2
> smembers books  # 注意顺序,和插入的并不一致,因为 set 是无序的
1) "java"
2) "python"
3) "golang"
> sismember books java  # 查询某个 value 是否存在,相当于 contains(o)
(integer) 1
> sismember books rust
(integer) 0
> scard books  # 获取长度相当于 count()
(integer) 3
> spop books  # 弹出一个
"java"

zset:
类似于SortedSet和HashMap的结合体,set既可以保证value的唯一性,另一方面可以给每个value 赋予一个值,代表着排序权重
zset 可以用来存储粉丝列表,value值是粉丝的用户ID,score是关注时间,对粉丝类表按照关注时间进行排序
参考资料 操作实例

> zadd books 9.0 "think in java"
(integer) 1
> zadd books 8.9 "java concurrency"
(integer) 1
> zadd books 8.6 "java cookbook"
(integer) 1
> zrange books 0 -1  # 按 score 排序列出,参数区间为排名范围
1) "java cookbook"
2) "java concurrency"
3) "think in java"
> zrevrange books 0 -1  # 按 score 逆序列出,参数区间为排名范围
1) "think in java"
2) "java concurrency"
3) "java cookbook"
> zcard books  # 相当于 count()
(integer) 3
> zscore books "java concurrency"  # 获取指定 value 的 score
"8.9000000000000004"  # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题
> zrank books "java concurrency"  # 排名
(integer) 1
> zrangebyscore books 0 8.91  # 根据分值区间遍历 zset
1) "java cookbook"
2) "java concurrency"
> zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
> zrem books "java concurrency"  # 删除 value
(integer) 1
> zrange books 0 -1
1) "java cookbook"
2) "think in java"

这里给出redis的 命令参考地址:http://redisdoc.com/,这里涵盖了很全面的有关redis的相关知识,联系指令可以在这里学习。


后续陆续会对Redis主从复制Redis哨兵模式Redis-Cluster集群进行学习总结。


努力吧,骚年

各位大佬赏脸关注个人公众号:JavaDeveloperCorner

微信公众号

相关文章

  • 【Redis】Redis学习笔记(五)jedis(JedisCl

    redis系列文章目录 redis学习笔记(一)redis3.2.5集群安装与测试 redis学习笔记(二)Jed...

  • Redis学习笔记:事务

    Redis学习笔记:事务 原文链接:Redis学习笔记:事务 一、事务的描述 和MySQL一样,Redis中也有事...

  • Redis 参数

    Redis Redis 学习笔记 II 常见参数配置

  • 2018-11-12

    Redis学习笔记 Redis在在线测试 Redis官网 REmote DIctionary Server(Red...

  • 数据库Redis在Windows上的使用教程

    Redis学习笔记----Redis在windows上的安装配置和使用 Redis简介 redis是一个key-v...

  • Redis 初识

    初识 Redis 《 Redis 开发与运维》的学习笔记,希望大家多多指导。 什么是 Redis Redis 的全...

  • Redis—Redis入门安装及基础数据的知识

    Redis学习笔记所有文章:https://www.jianshu.com/nb/33547142 Redis安装...

  • Redis 数据类型

    Redis Redis 学习笔记 II Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、...

  • Redis 安装

    Redis Redis 学习笔记 I Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可...

  • Redis 学习笔记

    Redis 学习笔记 原文:硬核!16000 字 Redis 面试知识点总结,建议收藏! Redis 基础知识 R...

网友评论

    本文标题:Redis学习笔记(一)

    本文链接:https://www.haomeiwen.com/subject/nfepoftx.html