babasport Redis使用实例
来源:互联网 发布:最小截图软件 编辑:程序博客网 时间:2024/06/07 09:50
在项目中使用了Redis, 因为在项目中暂时只涉及到使用Redis生成主键, 那么本就来讲一下Redis安装的方法和Redis生成主键的优点以及和其他几种方式生成主键的对比.
1,Redis安装
首先将Redis的tar包拷贝到Linux下的根目录
然后解压到redis件夹下:(先使用mkdir创建redis件夹)
接下来就是解压tar包到redis目录下:
解压后的目录结构:
编译: 使用Make命令
安装:
安装好之后的目录:
6379 下的目录结构:(这个rdb件时: redis database, 暂时不用管它, 重启后自动生成的)
bin下的目录结构:
配置后台运行:(将redis-3.0.0目录下的redis.conf件拷贝到6379目录下, 使用cp命令)
编辑redis.conf件(使用vim 命令编辑,修改daemonize为yes, 意思就是支持后台运行)
启动redis服务:(启动及停止命令)
客服端连接服务器:(如果是远程连接: http://www.toutiao.com/i6322791748837835265/bin/redis-cli -h 192.168.200.128 -p 6379)
命令行演示:
这样一个redis就启动完成了.
2, 使用Redis生成主键的优点及与其他生成主键方式的对比
Redis生成ID
当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。
可以使用Redis集群来获取更高的吞吐量。假如一个集群中有5台Redis。可以初始化每台Redis的值分别是1,2,3,4,5,然后步长都是5。各个Redis生成的ID为:
A:1,6,11,16,21
B:2,7,12,17,22
C:3,8,13,18,23
D:4,9,14,19,24
E:5,10,15,20,25
这个,随便负载到哪个机确定好,未来很难做修改。但是3-5台服务器基本能够满足器上,都可以获得不同的ID。但是步长和初始值一定需要事先需要了。使用Redis集群也可以方式单点故障的问题。
另外,比较适合使用Redis来生成每天从0开始的流水。比如订单=日期+当日自增长。可以每天在Redis中生成一个Key,使用INCR进行累加。
优点:
1)不依赖于数据库,灵活方便,且性能优于数据库。
2)数字ID天然排序,对分页或者需要排序的结果很有帮助。
缺点:
1)如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。
2)需要编码和配置的工作量比较大。
用INT做主键的优点:
1、需要很小的数据存储空间,仅仅需要4 byte 。
2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。
3、index和Join 操作,int的性能最好。
4、容易记忆。
5、支持通过函数获取最新的值,如:Scope_Indentity 。
使用INT做主键的缺点
1、如果经常有合并表的操作,就可能会出现主键重复的情况。
2、使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。
3、很难处理分布式存储的数据表。
使用GUID做主键的优点:
1、它是独一无二的。
2、出现重复的机会少。
3、适合大量数据中的插入和更新操作。
4、跨服务器数据合并非常方便。
使用GUID做主键的缺点:
1、存储空间大(16 byte),因此它将会占用更多的磁盘大小。
2、很难记忆。join操作性能比int要低。
3、没有内置的函数获取最新产生的guid主键。
4、GUID做主键将会添加到表上的所以其他索引中,因此会降低性能。
3. 代码中演示使用Redis
Java接口测试Redis:
Spring和Redis整合:
Service层:(ProductServiceIml.java)
@Autowired private Jedis jedis;
2 public void insertProduct(Product product){ 3 //商品设置 4 //ID自增长的方式不好, 在这里使用redis生成id 5 Long id=jedis.incr("pno"); 6 product.setId(id); 7 8 //设置默认下架 9 product.setIsShow(false);10 //默认不删除11 product.setIsDel(false);12 //时间13 product.setCreateTime(new Date);14 15 //保存商品, 在mer.xml中写的是返回自增长的主键id, 然后进行级联保存sku表16 //但是product如果已经设置了id 就不会再返回主键id了.17 productDao.insertSelective(product);18 19 //库存 多个20 for (String color : product.getColors.split(",")) {21 //尺码22 for(String size : product.getSizes.split(",")){23 Sku sku=new Sku;24 //商品ID 这个在mer.xml中设置返回主键id25 sku.setProductId(product.getId);26 //颜色 27 sku.setColorId(Long.parseLong(color));28 //市场价29 sku.setMarketPrice(0f);30 //售价31 sku.setPrice(0f);32 //运费33 sku.setDeliveFee(10f);34 //购买限制35 sku.setUpperLimit(188);36 //尺码37 sku.setSize(size);38 //时间39 sku.setCreateTime(new Date);40 //库存41 sku.setStock(0);42 skuDao.insertSelective(sku);43 }44 }45 }
看到这个最上面使用了Jdis去调用Redis服务, 然后使用incr对pno(在redis中可以对pno设置值)加1操作. 之前使用的都是自增长ID, 在mer.xml中insert完成之后自动返回主键id到product中, 在级联保存的时候可以直接使用product.getId. 下面就来看一下redis与spring整合的配置.
redis.xml配置件:
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:task="http://www.springframework.org/schema/task" 7 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 8 xsi:schemaLocation="http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 12 http://www.springframework.org/schema/context 13 http://www.springframework.org/schema/context/spring-context-4.0.xsd 14 http://www.springframework.org/schema/aop 15 http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 16 http://www.springframework.org/schema/tx 17 http://www.springframework.org/schema/tx/spring-tx-4.0.xsd18 http://www.springframework.org/schema/task19 http://www.springframework.org/schema/task/spring-task-4.0.xsd20 http://code.alibabatech.com/schema/dubbo 21 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">22 23 <!-- 整合Redis-->24 <bean id="jdis" class="redis.clients.jedis.Jedis">25 <constructor-arg value="192.168.200.128" index="0" type="java.lang.String"/>26 <constructor-arg value="6379" index="1"/>27 </bean> 28 29 </beans>
View Code
关于Redis的使用暂时就这么多, 下次还会继续分享更多的内容.
- babasport Redis使用实例
- [项目构建]babasport 分页的使用及解析.
- redis使用实例
- C++使用redis实例
- Redis使用实例(RedisHelper)
- redis 使用实例demo
- redis使用实例
- 使用redis-stat来监控redis实例
- celery supdervisor redis使用实例
- Redis整合Spring结合使用缓存实例
- Redis整合Spring结合使用缓存实例
- Redis整合Spring结合使用缓存实例
- Redis整合Spring结合使用缓存实例
- Redis整合Spring结合使用缓存实例
- Redis整合Spring结合使用缓存实例
- Redis之使用Java连接服务器实例
- Redis整合Spring结合使用缓存实例
- Redis整合Spring结合使用缓存实例
- 从零写u-boot,用于启动内核
- Android开发各类常见错误解决方案
- JQuery拓展方法之表单数据转Object—从而ajax post到后台
- HDOJ5907(BC上分之旅却死在了水题上)
- Java IO笔记
- babasport Redis使用实例
- Matlab基础之高维矩阵创建和应用
- Linux(7)RedHat7 基本命令六-date命令详解
- ThinkPHP教程
- Spark踩坑记--数据库
- Android开发学习之路-自定义控件
- 获得android设备的唯一标识
- 161002计算式和循环体
- D. Soldier and Number Game