Jadual Kandungan
Tetapan redis operasi Java tamat tempoh pada awal pagi keesokan harinya
Senario
Idea
kod
Pengenalan fungsi dasar tamat tempoh Redis
Tetapkan masa tamat tempoh
Penghapusan Memori
Rumah pangkalan data Redis Apakah penyelesaian bagi Java untuk mengendalikan redis dan menetapkan tamat tempoh pada awal pagi keesokan harinya?

Apakah penyelesaian bagi Java untuk mengendalikan redis dan menetapkan tamat tempoh pada awal pagi keesokan harinya?

May 26, 2023 pm 03:40 PM
java redis

Tetapan redis operasi Java tamat tempoh pada awal pagi keesokan harinya

Senario

Apabila menanyakan data, saya menghadapi masalah bahawa data perlu ditetapkan untuk tamat tempoh dalam redis seterusnya hari, tetapi redis mempunyai Tiada API yang sepadan, jadi saya perlu menyelesaikannya sendiri

Idea

Kira perbezaan masa antara awal pagi hari berikutnya dan masa semasa, dan tetapkan perbezaan masa sebagai masa tamat redis, kita boleh mencapai Kesan yang diingini

kod

/**
     * 计算第二天凌晨与当前时间的时间差秒数
     * @param
     * @return java.lang.Long
     * @author shy
     * @date 2021/3/12 18:10
     */
    public static Long getNowToNextDaySeconds() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
    }
Salin selepas log masuk

mendapat perbezaan masa, dan selebihnya pada dasarnya tiada masalah.

Dilampirkan ialah kelas alat Redis:

/**
 * 操作redis
 * @author shy
 * @date 2020/12/10 10:01
 */
@Service
public class RedisService {
	
	@Autowired
	private StringRedisTemplate stringRedisTemplate;
	
	@Autowired
    private RedisTemplate<String, Object> redisTemplate;
	
	/**
	 * 判断String类型key是否存在
	 *
	 * @param key
	 * @return 
	 * @author shy
	 * @date 2018年11月13日 下午1:40:37
	 */
	public boolean hasStringKey(String key) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		return stringRedisTemplate.opsForValue().getOperations().hasKey(key);
	}
	
	/**
	 * 判断String类型key是否存在
	 *
	 * @param key
	 * @return 
	 * @author shy
	 * @date 2018年11月13日 下午1:43:51
	 */
	public boolean nonStringKey(String key) {
		return !hasStringKey(key);
	}
	/**
	 * 设置String类型key,String类型value,过期时间timeout,TimeUnit
	 *
	 * @param key
	 * @param value
	 * @param timeout
	 * @param timeUnit
	 * @author shy
	 * @date 2018年12月10日13:53:38
	 */
	public void setStringKey(String key, String value, Long timeout, TimeUnit timeUnit) {
		if (StringUtils.isBlank(key) || Objects.isNull(timeout)) {
			throw new EmptyParameterException();
		}
		stringRedisTemplate.opsForValue().set(key, value, timeout, timeUnit);
	}
	
	public void setStringKey(String key, String value) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		stringRedisTemplate.opsForValue().set(key, value);
	}
	/**
	 * 获取String类型value
	 *
	 * @param key
	 * @return
	 * @author shy
	 * @date 2018年11月12日 下午7:09:31
	 */
	public String getStringValue(String key) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		return stringRedisTemplate.opsForValue().get(key);
	}
	
	/**
	 *	获取Key的过期时间
	 *
	 * @param key
	 * @return
	 * @author shy
	 * @date 2019年4月25日17:28:36
	 */
	public Long getExpire(String key) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		return stringRedisTemplate.getExpire(key);
	}
	
	/**
	 *	设置Key的过期时间
	 *
	 * @param key
	 * @return
	 * @author shy
	 * @date 2019年4月25日17:28:36
	 */
	public Boolean setExpire(String key,Long timeout, TimeUnit timeUnit) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		return stringRedisTemplate.expire(key, timeout, timeUnit);
	}	
	
	/**
	 * value自增+n
	 * @param key
	 * @return
	 * @author shy
	 * @date 2019年4月8日15:54:30
	 */
	public Long setIncrementValue(String key) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		return stringRedisTemplate.opsForValue().increment(key, 1L);
	}
	/**
	 * 设置String类型key,Object类型value,过期时间timeout
	 *
	 * @param key
	 * @param value
	 * @param timeout
	 * @author shy
	 * @date 2018年12月10日13:54:07
	 */
	public void setObjectKey(String key, Object value, Long timeout,TimeUnit time) {
		if (StringUtils.isBlank(key) || Objects.isNull(timeout)) {
			throw new EmptyParameterException();
		}
		redisTemplate.opsForValue().set(key, value, timeout, time);
	}
	
	public void setObjectKey(String key, Object value) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		redisTemplate.opsForValue().set(key, value);
	}
	
	/**
	 * 获取Object类型value
	 *
	 * @param key
	 * @param clazz
	 * @return 
	 * @author shy
	 * @date 2019年11月6日10:01:30
	 */
	@SuppressWarnings("unchecked")
	public <T> T getObjectValue(String key, Class<T> clazz) {
		if (StringUtils.isBlank(key)) {
			return null;
		}
		return (T) redisTemplate.opsForValue().get(key);
	}
	
	/**
	 * 移除单个String类型key
	 *
	 * @param key 
	 * @author shy
	 * @date 2018年11月13日 上午10:42:01
	 */
	public void removeSingleStringKey(String key) {
		if (StringUtils.isBlank(key)) {
			throw new EmptyParameterException();
		}
		stringRedisTemplate.opsForValue().getOperations().delete(key);
	}
	
	/**
	 * 移除Collection<String>类型keys
	 *
	 * @param keys 
	 * @author shy
	 * @date 2018年11月13日 下午3:15:16
	 */
	public void removeMultiStringKey(Collection<String> keys) {
		if (CollectionUtils.isNotEmpty(keys)) {
			stringRedisTemplate.opsForValue().getOperations().delete(keys);
		}
	}
	
	/**
	 * redis key 模糊查询
	 * @author shy
	 * @date 2021年1月4日 上午11:21:45
	 * @param key
	 * @return
	 */
	public Set<String> queryStringKeys(String key) {
		 return redisTemplate.keys(key + "*");
	}
}
Salin selepas log masuk

Pengenalan fungsi dasar tamat tempoh Redis

Apabila kami menggunakan redis, kami biasanya menetapkan masa tamat tempoh, sebanyak tentu ada juga yang tidak menetapkan masa luput iaitu tidak akan luput.

Apabila kami menetapkan masa tamat tempoh, bagaimana redis menentukan sama ada ia telah tamat tempoh dan strategi yang digunakan untuk memadamkannya.

Tetapkan masa tamat tempoh

Apabila kami menetapkan kunci, kami boleh memberikan masa tamat tempoh, contohnya, nyatakan bahawa kunci ini hanya boleh bertahan selama satu jam tetapkan kumpulan kunci untuk bertahan selama satu jam, kemudian bagaimana redis memadamkan kumpulan kunci ini satu jam kemudian?

Jawapannya ialah: pemadaman biasa + pemadaman malas.

Apa yang dipanggil pemadaman biasa bermaksud bahawa secara lalai, redis memilih beberapa kekunci secara rawak dengan masa tamat tempoh ditetapkan setiap 100ms, menyemak sama ada ia telah tamat tempoh dan memadamkannya jika ia tamat tempoh. Melintasi semua kunci dengan masa tamat tempoh setiap 100ms akan menyebabkan penurunan prestasi yang ketara, sila ambil perhatian. Redis sebenarnya akan memilih beberapa kekunci secara rawak untuk menyemak dan memadam setiap 100 milisaat.

Tetapi masalahnya ialah pemadaman biasa boleh menyebabkan banyak kunci yang telah tamat tempoh tidak dipadamkan apabila masanya tamat, jadi anda perlu memadamnya dengan malas, maksudnya, apabila anda mendapat kunci, redis akan menyemak untuk melihat sama ada kunci ini ditetapkan Masa tamat tempoh Jadi adakah ia telah tamat tempoh? Jika ia tamat tempoh, ia akan dipadamkan.

Dengan menggabungkan dua kaedah di atas, ia dijamin bahawa kunci yang telah tamat tempoh akan dimatikan. Semua kunci tamat tempoh tidak akan dipadamkan secara automatik apabila masa tamat tempoh dicapai, jadi penggunaan memori tidak akan berkurangan selepas tamat tempoh.

Tetapi sebenarnya, ini masih menjadi masalah Jika banyak kunci tamat tempoh terlepas oleh pemadaman biasa, dan kemudian ia tidak disemak dalam masa dan pemadaman malas dilakukan, ia akan menyebabkan sejumlah besar tamat tempoh. kunci untuk terkumpul dalam ingatan dan menggunakan memori redis , bagaimana untuk menangani keadaan ini?

Jawapannya ialah: gunakan mekanisme penghapusan ingatan.

Penghapusan Memori

Jika redis mengambil terlalu banyak ingatan, beberapa penyingkiran akan dilakukan pada masa ini. Terdapat beberapa strategi seperti berikut:

  • : Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, ralat akan dilaporkan untuk data yang baru ditulis Senario sebenar ini biasanya tidak digunakan. noeviction

  • : Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, dalam ruang kekunci, keluarkan kunci yang paling kurang digunakan (ini adalah yang paling biasa digunakan) allkeys-lru

  • : Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, kunci dialih keluar secara rawak daripada ruang kunci Ini biasanya kurang digunakan. allkeys-random

  • : Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, dalam ruang kekunci dengan set masa tamat, kunci yang paling kurang digunakan baru-baru ini dialih keluar. volatile-lru

  • : Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, kunci dialih keluar secara rawak daripada ruang kunci dengan masa tamat tempoh ditetapkan. volatile-random

  • : Apabila memori tidak mencukupi untuk menampung data yang baru ditulis, dalam ruang kekunci dengan masa tamat tempoh ditetapkan, kunci dengan masa tamat tempoh lebih awal akan dialih keluar terlebih dahulu. volatile-ttl

Penghapusan memori akan mencetuskan syarat penyingkiran untuk memadam kunci tertentu Ini juga sebab kunci hilang tanpa menetapkan masa tamat tempoh.

Atas ialah kandungan terperinci Apakah penyelesaian bagi Java untuk mengendalikan redis dan menetapkan tamat tempoh pada awal pagi keesokan harinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1677
14
Tutorial PHP
1280
29
Tutorial C#
1257
24
Pek pengembangan terbaik Laravel yang disyorkan: 2024 Alat penting Pek pengembangan terbaik Laravel yang disyorkan: 2024 Alat penting Apr 30, 2025 pm 02:18 PM

Pakej lanjutan Laravel yang penting untuk 2024 termasuk: 1 Laraveldebrugbar, yang digunakan untuk memantau dan debug kod; 2. Laraveltelescope, menyediakan pemantauan aplikasi terperinci; 3. Laravelhorizon, menguruskan tugas -tugas redis. Pek pengembangan ini dapat meningkatkan kecekapan pembangunan dan prestasi aplikasi.

Pembinaan Persekitaran Laravel dan Konfigurasi Asas (Windows/Mac/Linux) Pembinaan Persekitaran Laravel dan Konfigurasi Asas (Windows/Mac/Linux) Apr 30, 2025 pm 02:27 PM

Langkah -langkah untuk membina persekitaran Laravel pada sistem operasi yang berbeza adalah seperti berikut: 1.Windows: Gunakan XAMPP untuk memasang PHP dan komposer, konfigurasikan pembolehubah persekitaran, dan pasang Laravel. 2.MAC: Gunakan homebrew untuk memasang PHP dan komposer dan pasang Laravel. 3.Linux: Gunakan Ubuntu untuk mengemas kini sistem, pasang PHP dan komposer, dan pasang Laravel. Perintah dan laluan khusus setiap sistem adalah berbeza, tetapi langkah -langkah teras adalah konsisten untuk memastikan pembinaan lancar persekitaran pembangunan Laravel.

Apakah peranan Java dalam pembangunan peranti IoT (Internet of Things), memandangkan kemerdekaan platform? Apakah peranan Java dalam pembangunan peranti IoT (Internet of Things), memandangkan kemerdekaan platform? May 03, 2025 am 12:22 AM

JavaPlaysasignificantroleiniotduetoitsplatformindant.1) itAllowscodetobewrittenceandondrariousdevices.2) Java'secosystemprovidesuseFullibrariesforiot.3)

Apakah kelebihan menggunakan Java untuk aplikasi web yang perlu dijalankan pada pelayan yang berbeza? Apakah kelebihan menggunakan Java untuk aplikasi web yang perlu dijalankan pada pelayan yang berbeza? May 03, 2025 am 12:13 AM

Java sesuai untuk membangunkan aplikasi web cross-server. 1) Falsafah "Tulis Sekali, Di Mana -mana" Java membuat kodnya dijalankan di mana -mana platform yang menyokong JVM. 2) Java mempunyai ekosistem yang kaya, termasuk alat seperti Spring dan Hibernate, untuk memudahkan proses pembangunan. 3) Java melaksanakan dengan baik dalam prestasi dan keselamatan, menyediakan pengurusan memori yang cekap dan jaminan keselamatan yang kuat.

Cara menetapkan kesan putaran elemen HTML Cara menetapkan kesan putaran elemen HTML Apr 30, 2025 pm 02:42 PM

Bagaimana untuk menetapkan kesan putaran elemen dalam HTML? Ia boleh dicapai menggunakan CSS dan JavaScript. 1. Harta transformasi CSS digunakan untuk putaran statik, seperti berputar (45DEG). 2. JavaScript boleh mengawal putaran secara dinamik, yang dilaksanakan dengan mengubah atribut Transform.

Bagaimanakah kemerdekaan platform memudahkan penggunaan aplikasi Java? Bagaimanakah kemerdekaan platform memudahkan penggunaan aplikasi Java? May 02, 2025 am 12:15 AM

Java'splatformindependenceAllowsApplicationStoranyoperatingsystemwithajvm.1) singlecodebase: writeandcompileonceforallplatforms.2) Easyupdates: UpdateTecodeForsimulteUseUlyDeployment.3)

Redis: Membentangkan tujuan dan aplikasi utama Redis: Membentangkan tujuan dan aplikasi utama May 03, 2025 am 12:11 AM

Redisisanopen-Source, In-MenoryDataStructureStoreusedasadatabase, Cache, andMessageBroker, ExcellingInspeedandversatility.Iswidelyededforcaching, Real-Timeanalytics, sessionManagement, danSleaderboardsDuetoitssupportorvariousdatastructures

10 alat terkini untuk pemaju web 10 alat terkini untuk pemaju web May 07, 2025 pm 04:48 PM

Reka bentuk pembangunan web adalah bidang kerjaya yang menjanjikan. Walau bagaimanapun, industri ini juga menghadapi banyak cabaran. Memandangkan lebih banyak perniagaan dan jenama beralih ke pasaran dalam talian, pemaju web mempunyai peluang untuk menunjukkan kemahiran mereka dan berjaya dalam kerjaya mereka. Walau bagaimanapun, apabila permintaan untuk pembangunan web terus berkembang, bilangan pemaju juga semakin meningkat, mengakibatkan persaingan yang semakin sengit. Tetapi ia menarik bahawa jika anda mempunyai bakat dan kehendak, anda sentiasa dapat mencari cara baru untuk membuat reka bentuk dan idea yang unik. Sebagai pemaju web, anda mungkin perlu terus mencari alat dan sumber baru. Alat dan sumber baru ini bukan sahaja menjadikan pekerjaan anda lebih mudah, tetapi juga meningkatkan kualiti kerja anda, dengan itu membantu anda memenangi lebih banyak perniagaan dan pelanggan. Trend pembangunan web sentiasa berubah.

See all articles